SpringSecurity过滤器链

SpringSecurity采用的是责任链的设计模式,它有一条很长的过滤器链。

spring security 通过什么确定provider_信息保存

  • SecurityContextPersistenceFilter会在请求开始时从配置好的SecurityContextRepository中获取SecurityContext,然后把它设置给SecurityContextHolder。在请求完成后将SecurityHolder持有的SecurityContext再保存到配置好的SecurityContextRepository,同时清除SecurityContextHolder所持有的SecurityContext;
  • UsernamePassword
  • AuthenticationFilter用于处理来自表单提交的认证。该表单必须提供对应的用户名和密码,其内部还有登录成功或失败后进行处理的AuthenticationSuccessHandler和AuthenticationFailureHandler,这些都可以根据需求做相关改变;
  • ExceptionTranslationFilter能够捕获来自FilterChain所有的异常,并进行处理。

       但是它只会处理两类异常:AuthenticationException和AccessDeniedException,其它的异常它会继续抛出。

  •  如果捕获到的是AuthenticationException,那么将会使用其对应的AuthenticationEntryPoint的commence()处理。在处理之前,ExceptionTranslationFilter先使用RequestCache将当前的HttpServerletRequest的信息保存起来,以至于用户成功登陆后可以跳转到之前的界面;
  • 如果捕获到的是AccessDeniedException,那么当前访问的用户是否已经登陆认证做不同的处理,如果未登陆,则会使用关联的AuthenticationEntryPoint的commence()方法进行处理,否则将使用关联的AccessDeniedHandler的handle()方法进行处理。                 
  • FilterSecurityInterceptor是用于保护Http资源的,它需要一个AccessDecisionManager和一个AuthenticationManager的引用。它会从SecurityContextHolder获取Authentication,然后通过SecurityMetadataSource可以得知当前请求是否在请求受保护的资源。对于请求那些受保护的资源,如果Authentication.isAuthenticated()返回false或者FilterSecurityInterceptor的alwaysReauthenticate属性为true,那么将会使用其引用的AuthenticationManager再认证一次,认证之后再使用认证后的Authentication替换SecurityContextHolder中拥有的那个。然后就是利用AccessDecisionManager进行权限的检查;

说明:

  • AuthenticationEntryPoint是在用户没有登陆时用于引导用户进行登录认证的;
  • AccessDeniedHandler用于在用户已经登录了,但是访问其自身没有权限的资源时做出对应的处理【默认实现类:AccessDeniedHandlerImpl】;
  • RequestCache【默认实现类:HttpSessionRequestCache】会将HttpServletRequest相关信息封装为一个SavedRequest并保存到HttpSession中。

认证流程

spring security 通过什么确定provider_设计模式_02

说明:

  • 客户端发起一个请求,进入Security过滤链;
  • 当到LogoutFilter的时候判断是否是登出路径,如果是登录路径这道LogoutHandler,如果登出成功则到LogoutSuccessHandler登出成功处理,如果登出失败则由ExceptionTranslationFilter;如果不是登出路径则直接进入下一个过滤器;
  • 当到UsernamePasswordAuthenticationFilter的时候判断是否为登录路径,如果是,则进入该过滤器进行登录操作,如果登录失败则到AuthenticationFailureHandler登录失败处理器处理,如果登录成功则到AuthenticationSuccessHandler登录成功处理器处理,如果不是登录请求则不仅如此该过滤器;
  • 当到FilterSecurityInterceptor的时候会拿到uri,根据uri去找对应的鉴权管理器,鉴权管理器做鉴权工作,鉴权成功则到Controller层否则到AccessDentiedHandler鉴权失败处理器处理。