发布日期:2024-09-27 10:47:39

Spring Security

上图建立在 SecurityFilterChain 图上。

number 1 首先,一个用户向其未被授权的资源(/private)发出一个未经认证的请求。

number 2 pring Security 的 AuthorizationFilter 通过抛出一个 AccessDeniedException 来表明未经认证的请求被拒绝了。

number 3 由于用户没有被认证,ExceptionTranslationFilter 启动了 Start Authentication,并发送一个重定向到配置的 AuthenticationEntryPoint 的登录页面。在大多数情况下, AuthenticationEntryPoint 是 LoginUrlAuthenticationEntryPoint 的一个实例。

number 4 浏览器请求进入其被重定向的登录页面。

number 5 应用程序中的某些东西,必须渲染登录页面

当用户名和密码被提交后,UsernamePasswordAuthenticationFilter 会对用户名和密码进行认证。UsernamePasswordAuthenticationFilter 扩展了 AbstractAuthenticationProcessingFilter,所以下面的图看起来应该很相似。

usernamepasswordauthenticationfilter

Security Filter的一个示例

Security Filters1: 

[org.springframework.security.web.session.DisableEncodeUrlFilter@73c6ad43, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@6d5fb177, org.springframework.security.web.context.SecurityContextPersistenceFilter@4c9e0157, 
org.springframework.security.web.header.HeaderWriterFilter@29b4e99c,

org.springframework.web.filter.CorsFilter@695078a7, 
org.springframework.security.web.authentication.logout.LogoutFilter@1e649053, 

org.springframework.web.filter.CorsFilter@695078a7, 
com.maxwell.user.web.filter.JwtAuthenticationTokenFilter@5fef2934, 

org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@3f743e7b,
 
org.springframework.security.web.savedrequest.RequestCacheAwareFilter@7c861cd6, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@72f0e2d3, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@415f428c, 
org.springframework.security.web.session.SessionManagementFilter@4522b9c0, 

org.springframework.security.web.access.ExceptionTranslationFilter@7a494c2e, 
org.springframework.security.web.access.intercept.FilterSecurityInterceptor@4a3cd212]

 

在 Spring Security 中,这些过滤器的默认顺序是由 FilterComparator 类定义的,它在 HttpSecurity 的 build() 方法中对过滤器进行排序。以下是过滤器的默认顺序:

  1. ChannelProcessingFilter:处理通道安全。
  2. SecurityContextPersistenceFilter:持久化安全上下文。
  3. ConcurrentSessionFilter:处理并发会话。
  4. WebAsyncManagerIntegrationFilter:集成异步请求处理。
  5. HeaderWriterFilter:写入安全相关的HTTP头。
  6. CorsFilter:处理跨源请求。
  7. CsrfFilter:防止跨站请求伪造。
  8. LogoutFilter:处理用户注销。
  9. OAuth2AuthorizationRequestRedirectFilter:处理OAuth 2.0授权请求重定向。
  10. X509AuthenticationFilter:处理X.509证书认证。
  11. AbstractPreAuthenticatedProcessingFilter:处理预认证。
  12. CasAuthenticationFilter:处理CAS认证。
  13. OAuth2LoginAuthenticationFilter:处理OAuth 2.0登录认证。
  14. Saml2WebSsoAuthenticationRequestFilter:处理SAML 2.0 Web SSO认证请求。
  15. UsernamePasswordAuthenticationFilter:处理基于表单的登录认证。
  16. DefaultLoginPageGeneratingFilter:生成默认登录页面。
  17. DefaultLogoutPageGeneratingFilter:生成默认注销页面。
  18. DigestAuthenticationFilter:处理摘要认证。
  19. BearerTokenAuthenticationFilter:处理Bearer令牌认证。
  20. BasicAuthenticationFilter:处理基本认证。
  21. RequestCacheAwareFilter:缓存请求。
  22. SecurityContextHolderAwareRequestFilter:确保请求包装。
  23. JaasApiIntegrationFilter:集成JAAS认证。
  24. RememberMeAuthenticationFilter:处理“记住我”认证。
  25. AnonymousAuthenticationFilter:处理匿名认证。
  26. SessionManagementFilter:管理会话。
  27. ExceptionTranslationFilter:异常处理。
  28. FilterSecurityInterceptor:最终的安全拦截器。

请注意,这个顺序是内置过滤器的默认顺序,自定义过滤器可以通过 addFilterBefore、addFilterAfter 或 addFilterAt 方法插入到这个链中的特定位置。

参考文档

发表评论