目录
UserDetailsService详解
返回值
方法参数
异常
PasswordEncoder密码解析器详解
接口介绍
内置解析器介绍
BCryptPasswordEncoder简介
代码演示
自定义登录逻辑
编写配置类
自定义逻辑
-
UserDetailsService详解
- 当什么也没有配置的时候,账号和密码是由Spring Security定义生成的
- 而在实际项目中账号和密码都是从数据库中查询出来的
- 所以我们要通过自定义逻辑控制认证逻辑
- 如果需要自定义逻辑时,只需要实现UserDetailsService接口即可
- 接口定义如下:
-
返回值
- 返回值UserDetails是一个接口,定义如下:
- 要想返回UserDetails的实例就只能返回接口的实现类
- Spring Security中提供了如下的实例
- 我们只需要使用里面的User类即可
- 注意User的全限定路径是:
- org.springframework.security.core.userdetails.User
- 此处经常和系统中自己开发的User类弄混
- 在User类中提供了很多方法和属性
- 其中构造方法有两个,调用其中任何一个都可以实例化UserDetails实现类User类的实例
- 而三个参数的构造方法实际上也是调用7个参数的构造方法
- username:用户名
- password:密码
- authorities:用户具有的权限;此处不允许为null
- 此处的用户名应该是客户端传递过来的用户名
- 而密码应该是从数据库中查询出来的密码
- Spring Security会根据User中的password和客户端传递过来的password进行比较
- 如果相同则表示认证通过,如果不相同表示认证失败
- authorities里面的权限对于学习授权是很有必要的,包含的所有内容为此用户具有的权限,如有里面没有包含某个权限,而在做某个事情时必须包含某个权限则会出现403
- 通常都是通过AuthorityUtils.commaSeparatedStringToAuthorityList("")来创建authorities集合对象的
- 参数时一个字符串,多个权限使用逗号分隔
-
方法参数
- 方法参数表示用户名
- 此值是客户端表单传递过来的数据
- 默认情况下必须叫username,否则无法接收
-
异常
- UsernameNotFoundException 用户名没有发现异常
- 在loadUserByUsername中是需要通过自己的逻辑从数据库中取值的
- 如果通过用户名没有查询到对应的数据,应该抛出UsernameNotFoundException,系统就知道用户名没有查询到
-
PasswordEncoder密码解析器详解
- Spring Security要求容器中必须有PasswordEncoder实例
- 所以当自定义登录逻辑时要求必须给容器注入PaswordEncoder的bean对象
-
接口介绍
- encode():把参数按照特定的解析规则进行解析
- matches():验证从存储中获取的编码密码与编码后提交的原始密码是否匹配
- 如果密码匹配,则返回true
- 如果不匹配,则返回false
- 第一个参数表示需要被解析的密码;第二个参数表示存储的密码
- upgradeEncoding():如果解析的密码能够再次进行解析且达到更安全的结果则返回true,否则返回false;默认返回false
-
内置解析器介绍
- 在Spring Security中内置了很多解析器
-
BCryptPasswordEncoder简介
- BCryptPasswordEncoder是Spring Security官方推荐的密码解析器
- BCryptPasswordEncoder是对bcrypt强散列方法的具体实现
- 是基于Hash算法实现的单向加密
- 可以通过strength控制加密强度,默认10
-
代码演示
- 在项目src/test/java下新建com.msb.MyTest测试BCryptPasswordEncoder用法
-
自定义登录逻辑
- 当进行自定义登录逻辑时需要用到之前讲解的UserDetailsService和PasswordEncoder
- 但是Spring Security要求:当进行自定义登录逻辑时容器内必须有PasswordEncoder实例
- 所以不能直接new对象
-
编写配置类
- 新建类 com.msb.config.SecurityConfig 编写下面内容
-
自定义逻辑
- 在Spring Security中实现UserDetailService就表示为用户详情服务
- 在这个类中编写用户认证逻辑
- 重启项目后,在浏览器中输入账号:admin,密码:123,后可以正确进入到login.html页面