SpringSecurity认证流程

SpringSecurity
Spring Security,这是一种基于 Spring AOP 和 Servlet 过滤器的安全框架。 SpringSecurity采用的是责任式链的设计模式。它有一条很长的过滤器链;,
1,WebAsyncManagerIntegrationFilter:将Security上下文于SpringWeb中用于处理异步请求映射的WebAsyncmanager进行集成
2,SecurityContextPersistencrFilter:在每次请求处理之前将该请求相关的安全上下文信息加载到SecurityContextHolder中,然后在该次请求处理完成之后麻将SecurityContextHolder中关于这次请求的信息存储的‘仓储’中,然后将securityContextHolder中的信息清除,例如在Session中维护一个用户的安全信息就是这个过滤器处理的
3,HeaderWriterFilter:用于将头信息加入响应中,
4,CsrfFilter:用于处理跨站请求伪造
5,logoutFilter; 用于处理退出登录
6,UsernamePasswordAuthenticationFilter: 用于处理基于表单的登录请求,从表单中获取用户名和密码,默认情况下处理来自/login的请求,从表单中获取用户名和密码, 默认使用表单name值为username和password,这两个值可以通过这个过滤器的usernaemparamter个passwordParameter连个参数的值进行修改
7,DefaultLoginPageGeneratingFilter:如果没有配置登陆页面,那系统初始化就会配置这个过滤器。并且用于在需要进行登陆时生成一个登陆表单页
8,BasicAuthenticationFilter:检测和处理http basic认证
9,RequestCacheAwareFilter:用于处理请求的缓存
10:SecurityContextHolderAwarRequestFilter: 主要包装请求对象request
11,AnonymousAuthenticationfilter 检测SecurityContextHolder中是否存在Authentication对象,如果不存在为其提供一个匿名Authentication
12,SessionmanagementFilter;管理session的过滤器
13,ExceptionTranslationFilter:处理AccessDeniedException和AuthenticationException异常
14,FilterSecurityInterceptor: 可以看作过滤器链的出口
15,RememberMeAuthenticationFilter:当用户没有登录而直接访问资源时,从cookie力找出用户的信息,如果SpringSecurity能够识别出用户提供remember me cookie ,用户将不必填写用户名和密码,而是直接登录进入系统,该过滤器默认从不开启
SpringSecurity认证流程_第1张图片
认证流程
1.用户发送用户名和密码进行登录

2,先经过UsernamepasswordAuthenticationFilterd(父类为AbstractAuthenticationProcessingFilter)的attemptAuthentication(request,response),获取用户名和密码,封装 为UsernamePasswordAuthenticationToken,调用AuthenticationManager的authenticate(authentication) ----authentication对应第二步中的token
SpringSecurity认证流程_第2张图片
3,AuthenticationManager的authenticate(authentication),它的实现类为prooviderManager,并实现authenticate(),循环获取正确的AuthenticationProvider,调用AbstractUserDatailsAuthenticationProvider.authenticate(),
SpringSecurity认证流程_第3张图片
SpringSecurity认证流程_第4张图片
4,AbstractUserDatailsAuthenticationProvider.authenticate(),验证token是否符合这个类,在从缓存中获取用户信息,如果没有,则调用user = retrieveUser(username(UsernamePasswordAuthenticationToken) authentication),这个方法由子类DaoAuthenticationProvider实现,调用成功后会返回一个UserDetails对象,然后会检验用户名和密码,调用createSuccessAuthentication(..)返回一个Authentication对象
SpringSecurity认证流程_第5张图片
5,DaoAuthenticationProvider.retrieveUser() 中UserDetails loadedUser = this.getUserDetailsService().loadUserByUsername(username)表示调用UserDetailsService.loadUserByUsername(username);获取数据库中配置的用户信息。返回一个UserDetails
SpringSecurity认证流程_第6张图片
6,返回一个UserDetails后,由AbstractUserDatailsAuthenticationProvider方法调用createSuccessAuthentication(principalToReturn, authentication, user);封装成一个Authentication对象返回到AbstractAuthenticationProcessingFilter,然后将对象放入SecurityContext,再将SecurityContetx放入SecurityContextHolder
SpringSecurity认证流程_第7张图片
至此完成

你可能感兴趣的:(SpringSecurity认证流程)