- 过滤器
- 认证过程
- 鉴权过程
- FilterChainProxy
- WebSecurityConfigurerAdapter
- 认证过滤器(AbstractAuthenticationProcessingFilter)
- 认证凭证(AbstractAuthenticationToken)
- 提供者管理器(providerManager)
- 认证提供者(AuthenticationProvider)
- 安全拦截器(SecurityInterceptor)
- 受保护的资源(configAttribute)
- AccessDecisionManager
- AccessDecisionVoter
- ExceptionTranslationFilter
- 资源提供者(userDetail)
- 主体(principal)
- 已授权资源(GrantedAuthority)
- 处理器(handler)
过滤器
对满足要求的请求进行过滤,并且由当前过滤器决定是否将请求传递给下一个过滤器。
认证过程
- WebSecurityConfig,根据配置好的规则,对登录请求进行过滤。
- 先执行spring security的过滤器,然后才会执行原始的过滤器。(这估计使用过滤器的优先级得到的吧)
- AdminAuthenticationProcessingFilter,从请求中获取到用户名和密码,构建UserNamePasswordToken。
- 获取认证管理器ProviderManager,根据认证提供者AuthenticationProvider是否能处理当前token,来进行认证处理。
- 认证过程中根据UserDetailsService,获取用户相关的信息。
- 认证成功后会进行session策略的处理,然后将认证token放入到spring security容器的上下文中。
- 最后,调用认证成功处理器successHandler来进行处理,这里一般会终止请求,也就是将响应返回给前端(结合oauth token使用的话,可以在这里颁token发凭证)。
- 如果此时未登录的用户访问了受保护的资源,那么此时在securityContent中的token为anonymousToken
- 然后会在最后的过滤器FilterSecurityInterceptor中进行判断。
- 如果在这个过程中认证失败,会调用authenticationFailureHandler的函数进行处理(如用户名和密码不匹配)。
鉴权过程
使用过滤器 对受保护的资源进行 处理,对于不受保护的资源 进行放行处理。
鉴权流程,此时需要根据前端传过来的token信息构造出一个spring security的凭证。如果没有凭证的话,相当于匿名访问者(此时会构造出一个匿名token,并且isAuthenticated为true)。接着进行后面的授权流程,此时根据AccessDecisionManager来判断用户是否有权限进行访问受保护的资源。而AccessDecisionManager中会有多个AccessDecisionVoter来进行投票(这里可能支持多种方式的匹配规则,如webExpression表达式,xml等),只要有一个通过就代表可以正常访问资源。如果没有一个匹配,那么就会抛出accessDeniedException异常,如果此时是匿名用户则交由AuthenticationEntryPoint处理,如果不是匿名用户则交由accessDeniedHandler处理。
FilterChainProxy
FilterChainProxy,在原始的filter请求前先处理spring security的请求。
OncePerRequestFilter,在一次请求中通过一次Filter
持有filter的集合,在调用filter的doFilter方法时,会将自己传进去,这样就可以实现过滤器模式。

WebSecurityConfigurerAdapter
通过configure方法,以表达式的方式来配置 那些请求不需要权限认证,哪些请求需要权限认证,登陆成功后的处理器,登陆失败之后的处理器,登陆异常时的认证终点。
permitAll,可以被任何用户访问。
authenticated,可以被任何认证过的用户访问,不能是匿名用户。
认证过滤器(AbstractAuthenticationProcessingFilter)
过滤特定的http请求,从请求中得到必要的参数,来构造一个认证凭证(token),再交给providerManager来处理。
public AdminAuthenticationProcessingFilter() {super(new AntPathRequestMatcher(CommonConstant.LOGIN_URL_ADMIN, "POST"));}
认证凭证(AbstractAuthenticationToken)
常见的token为UserNamePasswordToken。
提供者管理器(providerManager)
调用认证提供者来判断,当前登陆的用户是否认证通过。
认证提供者(AuthenticationProvider)
用户认证通过后,需要给认证用户添加上可以访问的资源列表。
安全拦截器(SecurityInterceptor)
对请求的资源进行权限判断。如
受保护的资源(configAttribute)
系统中需要权限认证的资源。
AccessDecisionManager
根据权限规则 和 受保护的资源,调用投票者(Voter)来决定是否放行当前请求。
AccessDecisionVoter
对请求路径 和 受保护的资源 ,根据自己的权限规则进行 判断。
ExceptionTranslationFilter
异常转换过滤器,处理认证和授权时发生的java异常,然后将信息返回给前端。
AuthenticationEntryPoint
如果对于的请求没有通过授权或者认证,就会出现AccessDenied异常或者AuthenticationException。
如果是AuthenticationException,交由AuthenticationEntryPoint的commence处理。
_如果是_AccessDeniedException,交由AccessDeniedHandler处理。
资源提供者(userDetail)
认证时,提供用户信息的(数据库访问对象,包含资源)。
主体(principal)
需要认证的用户信息。
已授权资源(GrantedAuthority)
可以访问的受保护资源。
处理器(handler)
在登陆成功后,或者登陆失败后,可以指定处理器来进行处理。
