SpringSecurity认证流程
-
UsernamePasswordAuthenticationFilter :是我们最常用的用户名和密码认证方式的主要处理类,构造了一个UsernamePasswordAuthenticationToken对象实现类,将用请求信息封装为Authentication
-
Authentication接口 : 封装了用户相关信息。
-
AuthenticationManager接口 :定义了认证Authentication的方法,是认证相关的核心接口,也是发起认证的出发点,因为在实际需求中,我们可能会允许用户使用用户名+密码登录,同时允许用户使用邮箱+密码,手机号码+密码登录,甚至,可能允许用户使用指纹登录(还有这样的操作?没想到吧),所以说AuthenticationManager一般不直接认证,AuthenticationManager接口的常用实现类ProviderManager 内部会维护一个List列表,存放多种认证方式,实际上这是委托者模式的应用(Delegate)。也就是说,核心的认证入口始终只有一个:AuthenticationManager
AuthenticationManager,ProviderManager ,AuthenticationProvider…
用户名+密码(UsernamePasswordAuthenticationToken),邮箱+密码,手机号码+密码登录则对应了三个AuthenticationProvider
-
DaoAuthenticationProvider : 用于解析并认证 UsernamePasswordAuthenticationToken 的这样一个认证服务提供者,对应以上的几种登录方式。
-
UserDetailsService接口:Spring Security 会将前端填写的username 传给 UserDetailService.loadByUserName方法。我们只需要从数据库中根据用户名查找到用户信息然后封装为UserDetails的实现类返回给SpringSecurity 即可,自己不需要进行密码的比对工作,密码比对交由SpringSecurity处理。
-
UserDetails接口:提供核心用户信息。通过UserDetailsService根据用户名获取处理的用户信息要封装成UserDetails对象返回。然后将这些信息封装到Authentication对象中。
SpringSecurity原理剖析
SpringSecurity的原理其实就是一个过滤器链,内部包含了提供各种功能的过滤器。
- 其实 UsernamePasswordAuthenticationFilter 前面还有过滤器 SecurityContextPersistenceFilter
SecurityContextPersistenceFilter 两个主要职责:
请求来临时,创建SecurityContextHolder安全上下文信息
请求结束时,清空SecurityContextHolder安全上下文信息
- 其实 UsernamePasswordAuthenticationFilter 后还有过滤器 AnonymousAuthenticationFilter
AnonymousAuthenticationFilter 匿名身份过滤器
这个过滤器个人认为很重要,需要将它与UsernamePasswordAuthenticationFilter 放在一起比较理解
spring security为了兼容未 登录的访问,也走了一套认证流程,只不过是一个匿名的身份。
-
UsernamePasswordAuthenticationFilter :是我们最常用的用户名和密码认证方式的主要处理类,构造了一个UsernamePasswordAuthenticationToken对象实现类,将用请求信息封装为Authentication
-
BasicAuthenticationFilter… :将UsernamePasswordAuthenticationFilter的实现类UsernamePasswordAuthenticationToken封装成的 Authentication进行登录逻辑处理
-
ExceptionTranslationFilter :主要用于处理AuthenticationException(认证)和AccessDeniedException(授权)的异常
-
FilterSecurityInterceptor : 获取当前 request 对应的**权限配置****,调用访问控制器进行鉴权操作@prePostEnabled注解