1.BCrypt密码加密
一.BCrypt简介
- 在用户模块,对于用户密码的保护,通常都会进行加密。我们通常对密码进行加密,然后存放在数据库中,在用户进行登录的时候,将其输入的密码进行加密然后与数据库中存放的密文进行比较,以验证用户密码是否正确。 目前,MD5和BCrypt比较流行。相对来说,BCrypt比MD5更安全。
- BCrypt 官网http://www.mindrot.org/projects/jBCrypt/
二.快速入门
- 我们从官网下载源码
- 新建工程,将源码类BCrypt拷贝到工程
- 新建测试类,main方法中编写代码,实现对密码的加密
- 新建测试类,main方法中编写代码,实现对密码的校验。BCrypt不支持反运算,只支持密码校验。
2.安全框架Spring Security
一.Spring Security简介
- 安全框架概述
什么是安全框架? 解决系统安全问题的框架。如果没有安全框架,我们需要手动处理每个资源的访问控制,非常麻烦。使用安全框架,我们可以通过配置的方式实现对资源的访问限制。 - 常用安全框架
- Spring Security:spring家族一员。是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。
- Apache Shiro 是一个功能强大且易于使用的Java安全框架,提供了认证,授权,加密,和会话管理。
- 认证与授权
认证:限制用户只能登陆才可以访问资源。
授权:限制用户必须有某资源的访问权限才可以访问。
二.快速入门
- 简单案例:
- 需求:实现简单的登陆,当用户没有登陆访问主页执行拦截跳转到登陆,登陆后跳转到主页。实现退出登陆的功能,退出后再次访问主页仍然拦截。用户名和密码不连接数据库,直接在配置文件中配置。
- 新建war工程,pom文件引入依赖
- 创建webapp/WEB-INF/web.xml
- resources下创建spring-security.xml
{noop}是制定密码加密策略为不加密 。noop的意思是明文保存的密码 (noop: NoOperation)
form-login 为开启表单登陆 - webapp下创建index.html,内容随意。
- 密码加密策略
spring security官方推荐使用更加安全的bcrypt加密方式。spring security 5支持的加密方式有bcrypt、ldap、MD4、MD5、noop、pbkdf2、scrypt、SHA-1、SHA-256、sha256。- 修改配置文件中的password为bcrypt加密后的密码,并制定加密策略为bcrypt
- 我们还有另外一种配置方式,来制定加密策略
- 修改配置文件中的password为bcrypt加密后的密码,并制定加密策略为bcrypt
- 自定义登录页
- 创建页面login.html
- 创建login_error.html
- 修改spring-security.xml拦截规则部分
csrf : 跨站请求伪造
- UserDetailService
- 创建UserDetailsServiceImpl
- 修改配置文件 spring-security.xml认证管理器部分
- 创建UserDetailsServiceImpl
3.登录认证
一.需求分析
- 实现管理后台的登录功能。登录页采用前端提供的页面。
二.代码实现
qingcheng_common_web已经添加了springsecurity依赖
- 添加登录页面(资源提供)。修改login.html ,指定表单提交地址为/login ,用户名和密码框的name 为username 和password
- 添加图标文件到webapp 。 资料\静态原型\网站前台\qingcheng\img\favicon.ico
- qingcheng_web_manager工程web.xml添加配置
注意:此配置必须加在springmvc之前 - qingcheng_web_manager工程添加配置文件applicationContext_security.xml,内容参照入门案例spring-security.xml ,添加配置
修改目标页地址为main.html - qingcheng_web_manager工程添加UserDetailsServiceImpl
三.表结构分析
- 系统数据库qingcheng_system .tb_admin 表(管理员表)
四.用户认证代码实现
- 修改UserDetailsServiceImpl
4.菜单展示
一.需求分析
- 从数据库中读取菜单数据并展示。菜单为三级菜单
二.表结构分析
- tb_menu (菜单表)
三.后端代码
- MenuService接口新增方法定义,用于返回全部菜单
- MenuServiceImpl实现此方法
- qingcheng_web_manager工程MenuController新增方法
四.前端代码
- 修改页面的JS代码
五.同源策略设置
- 由于我们的main.html是框架页,需要修改同源策略。
- response header 可用于指示是否应该允许浏览器呈现在一个页面(同源策略)
同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。
如果两个url,协议、地址和端口都相同,我们称两个url为同源。 - Spring Security下,X-Frame-Options默认为DENY. 如果不修改同源策略,框架页内将无法显示内容。
DENY:浏览器拒绝当前页面加载任何Frame页面
SAMEORIGIN:frame页面的地址只能为同源域名下的页面
ALLOW-FROM:origin为允许frame加载的页面地址。
六.获取当前登陆人
- 需求:主界面显示当前登陆人
实现思路:后端编写controller输出当前登录人,前端异步调用。 - 后端代码实现:
- 前端代码实现:
在main.html中添加属性loginName,用于存储当前的登陆人
created()方法添加代码
页面显示登陆人
七.退出登录
- 当我们在spring security配置文件中配置了 <logout/> 后,框架会为我们自动提供退出功能,地址为/logout,要求以post方式提交。
- main.html新增方法
- 退出菜单调用:
5.管理员登录日志
一.需求分析
- 管理员登录后,记录管理员名称、登录时间、ip、浏览器类型、所在地区等信息 。
二.表结构分析
- tb_login_log 表
三.登录成功处理器
- spring security为我们提供了一个叫“登录成功处理器”的组件,我们可以实现在登录后进行的后续处理逻辑。
- applicationContext_security.xml新增配置
四.登录日志处理
- 修改qingcheng_web_manager的AuthenticationSuccessHandlerImpl
五.根据IP获取城市信息
- 将资源中提供的工具类WebUtil复制到qingcheng_common_web工程
- WebUtil类的getCityByIP用于根据IP地址获取城市信息,修改代码
六.获取浏览器名称
获取到的信息如下:- 我们没有必要存这么长的字符串,我们只需要存储一个浏览器名称就可以了,
所以我们用到了WebUtil给我们提供的方法 getBrowserName( String agent )
七.我的登录日志列表
- 需求:查询我的登录日志列表
实现思路:后端获取当前登录人账号作为查询条件。前端精简生成的增删改查代码。
6.修改密码
一.需求分析
- 需求:界面输入原密码,新密码,确认密码。 新密码和确认密码必须一致,在前端校
验。提交给后端后,后端判断原密码是否正确,如果正确,修改密码,注意密码要使用
BCrypt加密。
二.思路提示
- 获取当前登陆人。
- BCrypt校验密码与加密。