spring的认证授权是通过一些列的Filter实现的,最后请求才会到达DispatcherSevlet,分发到对应的controller处理器。Filter的入口就是filterName为springSecurityFilterChain代理过滤器DelegatingFilterProxy,
这个过滤器是由sevlet容器管理,在这个过滤器中会通过beanName为springSecurityFilterChain,从spring容器中获取在配置类WebSecurityConfiguration中注入容器的过滤器链,并执行过滤器链。
认证:
AuthenticationManager:认证管理类,负责用户身份的认证过程。默认使用ProviderManager实现类。AuthenticationManager通过一系列的AuthenticationProvider完成认证过程,
spring security提供了多种AuthenticationProvider的实现类,也可以自定义。AuthenticationManagerConfiguration配置类,把AuthenticationManager注入到spring容器,
这个配置类本身通过springboot的自动加载机制完成注入。经过AuthenticationManager认证之后会返回一个认证的Authentication对象。
SecurityContextPersistenceFilter: 优先从HttpSessionSecurityContextRepository(已认证信息会通过这个类保存到session)中获取SecurityContext,并设置到SecurityContextHolder,便于后面使用。请求处理完后会在这里把
SecurityContextHolder中的认证信息清除,并保存到session中
AbstractAuthenticationProcessingFilter: 认证请求处理基类,有很多实现类,比如常用的用户密码认证使用UsernamePasswordAuthenticationFilter进行认证处理,在这里会调用AuthenticationManager进行认证,认证成功
以后会返回一个经过认证的Authentication(包含用户信息和权限信息),会通过SessionAuthenticationStrategy.onAuthentication(...)保护session的避免攻击,还要将认证信息保存到SecurityContextHolder,并调用成功
认证处理器AuthenticationSuccessHandler。
授权:
用户经过认证之后,被系统认定为是合法的用户,但是每个用户的权限是不一样的,所能访问的资源也是不同的。所以需要对用户访问资源进行授权。
ExceptionTransactionFilter: 处理AccessDeniedException和AuthenticationException两种异常,这个filter在AbstractSecurityInterceptor前面,对这两种异常进行捕获,并进行响应,使用AuthenticationEntryPoint
进行处理。
AbstractSecurityInterceptor: 有两个实现类,FilterSecurityInterceptor用来对http请求资源进行授权;MethodSecurityInterceptor通过AOP的方式对方法的调用进行授权,重点相关类是MapBasedMethodSecurityMetadataSource
这个类存储了方法的授权信息,授权信息通过@Secured("IS_AUTHENTICATED_ANONYMOUSLY")注解配置在方法上。