Spring Security
上图建立在 SecurityFilterChain 图上。
首先,一个用户向其未被授权的资源(/private)发出一个未经认证的请求。
pring Security 的 AuthorizationFilter 通过抛出一个 AccessDeniedException 来表明未经认证的请求被拒绝了。
由于用户没有被认证,ExceptionTranslationFilter 启动了 Start Authentication,并发送一个重定向到配置的 AuthenticationEntryPoint 的登录页面。在大多数情况下, AuthenticationEntryPoint 是 LoginUrlAuthenticationEntryPoint 的一个实例。
浏览器请求进入其被重定向的登录页面。
应用程序中的某些东西,必须渲染登录页面。
当用户名和密码被提交后,UsernamePasswordAuthenticationFilter 会对用户名和密码进行认证。UsernamePasswordAuthenticationFilter 扩展了 AbstractAuthenticationProcessingFilter,所以下面的图看起来应该很相似。
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() 方法中对过滤器进行排序。以下是过滤器的默认顺序:
请注意,这个顺序是内置过滤器的默认顺序,自定义过滤器可以通过 addFilterBefore、addFilterAfter 或 addFilterAt 方法插入到这个链中的特定位置。
参考文档