1. PasswordEncoder 密码解析器详解
Spring Security 要求容器中必须有 PasswordEncoder 实例。所以当
自定义登录逻辑时要求必须给容器注入 PaswordEncoder 的 bean 对象
接口介绍:
encode():把参数按照特定的解析规则进行解析。
matches()验证从存储中获取的编码密码与编码后提交的原始密
码是否匹配。如果密码匹配,则返回 true;如果不匹配,则返回 false。
第一个参数表示需要被解析的密码。第二个参数表示存储的密码。
upgradeEncoding():如果解析的密码能够再次进行解析且达到更
安全的结果则返回 true,否则返回 false。默认返回 false。
![bece9776fe5973bf66601d6446c1471e.png](https://img-blog.csdnimg.cn/img_convert/bece9776fe5973bf66601d6446c1471e.png)
内置解析器介绍
在 Spring Security 中内置了很多解析器。
![0274276d1f947995984e792b4876604d.png](https://img-blog.csdnimg.cn/img_convert/0274276d1f947995984e792b4876604d.png)
BCryptPasswordEncoder 简介
BCryptPasswordEncoder 是 Spring Security 官方推荐的密码解析
器,平时多使用这个解析器。
BCryptPasswordEncoder 是对 bcrypt 强散列方法的具体实现。是
基于 Hash 算法实现的单向加密。可以通过 strength 控制加密强度,
默认 10.
代码演示
在 项 目 src/test/java 下 新 建 com.bjsxt.MyTest 测 试
BCryptPasswordEncoder 用法。
@SpringBootTest
2. 自定义登录逻辑
当 进 行 自 定 义 登 录 逻 辑 时 需 要 用 到 之 前 讲 解 的
UserDetailsService 和 PasswordEncoder。但是 Spring Security 要求:当进行自定义登录逻辑时容器内必须有 PasswordEncoder 实例。所以不
能直接 new 对象。
编写配置类
新建类 com.bjsxt.config.SecurityConfig 编写下面内容
@Configuration
自定义逻辑
在 Spring Security 中实现 UserDetailService 就表示为用户详情服
务。在这个类中编写用户认证逻辑。
@Service
查看效果
重启项目后,在浏览器中输入账号:admin,密码:123。后可以
正确进入到 login.html 页面。
3. 自定义登录页面
虽然 Spring Security 给我们提供了登录页面,但是对于实际项目
中,大多喜欢使用自己的登录页面。所以 Spring Security 中不仅仅提
供了登录页面,还支持用户自定义登录页面。实现过程也比较简单,
只需要修改配置类即可。
编写登录页面
编写登录页面,登录页面中<form>的 action 不编写对应控制器也
可以。
<!DOCTYPE html>
修改配置类
修改配置类中主要是设置哪个页面是登录页面。配置类需要继承
WebSecurityConfigurerAdapte,并重写 configure 方法。
successForwardUrl()登录成功后跳转地址
loginPage() 登录页面
loginProcessingUrl 登录页面表单提交地址,此地址可以不真实存
在。
antMatchers():匹配内容
permitAll():允许
@Configuration
编写控制器
编写控制器,当用户登录成功后跳转 toMain 控制器。编写完成
控制器后编写 main.html。页面中随意写上一句话表示 main.html 页面
内容即可。而之前的/login 控制器方法是不执行的,所以可以删除了。
@Controller
4. 失败跳转
表单处理中成功会跳转到一个地址,失败也可以跳转到一个地址中。
编写页面
在 src/main/resources/static 下新建 fail.html 并编写如下内容.
<!DOCTYPE html>
修改表单配置
在配置方法中表单认证部分添加 failureForwardUrl()方法,表示登
录失败跳转的 url。此处依然是 POST 请求,所以跳转到可以接收 POST
请求的控制器/fail 中。
// 表单认证
添加控制器方法
在控制器类中添加控制器方法,方法映射路径/fail。此处要注意:
由于是 POST 请求访问/fail。所以如果返回值直接转发到 fail.html 中,
及时有效果,控制台也会报警告,提示 fail.html 不支持 POST 访问方式。
@PostMapping
设置 fail.html 不需要认证
认证失败跳转到 fail.html 页面中,所以必须配置 fail.html 不需要
被认证。需要修改配置类中内容.
// url 拦截
5. 设置请求账户和密码的参数名
源码简介
当进行登录时会执行 UsernamePasswordAuthenticationFilter 过滤器。
usernamePasrameter:账户参数名
passwordParameter:密码参数名
postOnly=true:默认情况下只允许 POST 请求。
![6750fcb549433545673410e14f036503.png](https://img-blog.csdnimg.cn/img_convert/6750fcb549433545673410e14f036503.png)
修改配置
// 表单认证
修改页面
修改 login.html
<
6. 自定义登录成功处理器
源码分析
使用 successForwardUrl()时表示成功后转发请求到地址。内部是
通过 successHandler()方法进行控制成功后交给哪个类进行处理。