过滤器

对满足要求的请求进行过滤,并且由当前过滤器决定是否将请求传递给下一个过滤器。

认证过程

  1. WebSecurityConfig,根据配置好的规则,对登录请求进行过滤。
  2. 先执行spring security的过滤器,然后才会执行原始的过滤器。(这估计使用过滤器的优先级得到的吧)
  3. AdminAuthenticationProcessingFilter,从请求中获取到用户名和密码,构建UserNamePasswordToken。
  4. 获取认证管理器ProviderManager,根据认证提供者AuthenticationProvider是否能处理当前token,来进行认证处理。
  5. 认证过程中根据UserDetailsService,获取用户相关的信息。
  6. 认证成功后会进行session策略的处理,然后将认证token放入到spring security容器的上下文中。
  7. 最后,调用认证成功处理器successHandler来进行处理,这里一般会终止请求,也就是将响应返回给前端(结合oauth token使用的话,可以在这里颁token发凭证)。
  1. 如果此时未登录的用户访问了受保护的资源,那么此时在securityContent中的token为anonymousToken
  2. 然后会在最后的过滤器FilterSecurityInterceptor中进行判断。
  3. 如果在这个过程中认证失败,会调用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方法时,会将自己传进去,这样就可以实现过滤器模式。

image.png

WebSecurityConfigurerAdapter

通过configure方法,以表达式的方式来配置 那些请求不需要权限认证,哪些请求需要权限认证,登陆成功后的处理器,登陆失败之后的处理器,登陆异常时的认证终点。

permitAll,可以被任何用户访问。
authenticated,可以被任何认证过的用户访问,不能是匿名用户。

认证过滤器(AbstractAuthenticationProcessingFilter)

过滤特定的http请求,从请求中得到必要的参数,来构造一个认证凭证(token),再交给providerManager来处理。

  1. public AdminAuthenticationProcessingFilter() {
  2. super(new AntPathRequestMatcher(CommonConstant.LOGIN_URL_ADMIN, "POST"));
  3. }

认证凭证(AbstractAuthenticationToken)

常见的token为UserNamePasswordToken。

提供者管理器(providerManager)

调用认证提供者来判断,当前登陆的用户是否认证通过。

认证提供者(AuthenticationProvider)

用户认证通过后,需要给认证用户添加上可以访问的资源列表。

安全拦截器(SecurityInterceptor)

对请求的资源进行权限判断。如

受保护的资源(configAttribute)

系统中需要权限认证的资源。

AccessDecisionManager

根据权限规则 和 受保护的资源,调用投票者(Voter)来决定是否放行当前请求。

AccessDecisionVoter

对请求路径 和 受保护的资源 ,根据自己的权限规则进行 判断。

ExceptionTranslationFilter

异常转换过滤器,处理认证和授权时发生的java异常,然后将信息返回给前端。

AuthenticationEntryPoint

如果对于的请求没有通过授权或者认证,就会出现AccessDenied异常或者AuthenticationException。

如果是AuthenticationException,交由AuthenticationEntryPoint的commence处理。
_如果是_AccessDeniedException,交由AccessDeniedHandler处理。

资源提供者(userDetail)

认证时,提供用户信息的(数据库访问对象,包含资源)。

主体(principal)

需要认证的用户信息。

已授权资源(GrantedAuthority)

可以访问的受保护资源。

处理器(handler)

在登陆成功后,或者登陆失败后,可以指定处理器来进行处理。