Spring Security --- 自定义登录逻辑

目录

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页面

猜你喜欢

转载自blog.csdn.net/weixin_59624686/article/details/131236268