Spring Security 密码方式认证代码解析
Spring Security教程网上都有,可以先自行下载到本地运行。
我现在只讲讲其中用密码认证时,匹配密码是否一致的具体代码在哪里看。
首先,我们在WebSecurityConfig中先配置密码加密的方式,一般都是BCryptPasswordEncoder这种的加密方法
让我们仔细分析认证过程:
- 用户提交用户名、密码被SecurityFilterChain中的 UsernamePasswordAuthenticationFilter 过滤器获取到, 封装为请求Authentication,通常情况下是UsernamePasswordAuthenticationToken这个实现类。
- 然后过滤器将Authentication提交至认证管理器(AuthenticationManager)进行认证
- 认证成功后, AuthenticationManager 身份管理器返回一个被填充满了信息的(包括上面提到的权限信息, 身份信息,细节信息,但密码通常会被移除) Authentication 实例。
- SecurityContextHolder 安全上下文容器将第3步填充了信息的 Authentication ,通过 SecurityContextHolder.getContext().setAuthentication(…)方法,设置到其中
在我们程序运行时,后台可以获取用户从浏览器中输入的账号和密码,
我们一般先会根据获取的用户名去数据库中查询该用户下的已加密的密码。
封装成UserDetails,接着会进入AbstractUserDetailsAuthenticationProvider类中的authenticate方法,该方法内调用一个DaoAuthenticationProvider类中的additionalAuthenticationChecks方法
其中的if判断就是匹配输入的密码是否和数据库中的一致,matchs方法选择你对应加密的BCryptPasswordEncoder类
这样就可以知道是否匹配了。