SpringSecurity认证流程
2022-03-28 00:23:34 0 举报
SpringSecurity认证流程
作者其他创作
大纲/内容
7.AbstractAuthenticationProcessingFilter#doFilter
UsernamePasswordAuthenticationFilter
8.1 successfulAuthentication:SecurityContextHolder.getContext().setAuthentication(authResult);8.2 unsuccessfulAuthentication:SecurityContextHolder.clearContext();
7.1 因为 doFilter() 中调用了 attemptAuthentication(),因此要将最终获得的 Authentication对象返回到该处。7.2 根据认证的成功或者失败调用相应的 handler。
当前未认证
2.ProviderManager#authenticate
将用户的认证信息交给 AuthenticationManager 处理
5.UserDetailsService#loadUserByUsername
3.AbstractUserDetailsAuthenticationProvider#authenticate
UsernamePasswordAuthenticationToken
4.1 调用 UserDetailsService#loaUserByUsername 去数据库中读取用户信息,将其封装并返回 UserDetails。
登录请求
8.AbstractAuthenticationProcessingFilter#successfulAuthentication / unsuccessfulAuthentication
AuthenticationProvider
得到 Authentication 对象
AuthenticationManager
认证阶段
继承
AuthenticationManager 管理所有的 AuthenticationProvider,并将认证信息交给合适的 AuthenticationProvider 来实现认证,在登录认证时将认证信息交给了其实现类 ProviderManager。
1.1 判断请求方法是否为POST1.2 获取用户名和密码,底层是 request.getParameter();1.3 根据用户名和密码构建 UsernamePasswordAuthenticationToken,即用户的认证信息;username 对应 principal、password 对应 credentials;注意,两个参数 - setAuthenticated(false)、三个参数 setAuthenticated(true);1.4 setDetails,底层实际上调用的是WebAuthenticationDetails#buildDetails(其中又调用了其构造方法),最终获取到 remoteAddr 和 sessionId 封装到 WebAuthenticationDetails,返回到 AbstractAuthenticationToken(UsernamePasswordAuthenticationToken的父类) 中的details属性。
校验阶段
6.AbstractUserDetailsAuthenticationProvider#createSuccessAuthentication
3.1 开启缓存,并根据用户名从缓存中获取用户信息。3.2 调用 retrieveUser() 方法实现进一步的认证。
4.DaoAuthenticationProvider#retrieveUser
返回UserDetails 对象
1.UsernamePasswordAuthenticationFilter#attemptAuthentication
得到 UserDetail 对象
2.1 该类是 AuthenticationManager的实现类,负责管理所有的 AuthenticationProvider(不同的Provider表示不同的认证逻辑,SpringSecurity支持多种认证逻辑)。2.2 遍历所有 AuthenticationProvider 并通过 support 方法判断其是否支持当前的认证逻辑。2.3 再交给其抽象子类的authenticate()方法实现进一步的认证。
6.1 对UserDetails,进行 preAuthenticationChecks() “前认证校验”、additionalAuthenticationChecks() “附加验证校验”、postAuthenticationChecks() “后验证校验”。6.2 校验成功后调用 createSuccessAuthentication,在该方法中重新创建了一个 UsernamePasswordAuthenticationToken,因为认证通过了,所以将 authorities 注入,并且设置 authenticated 为 true。6.3 返回Authentication对象给 UsernamePasswordAuthenticationFilter。
UserDetailsService
收藏
0 条评论
下一页