spring security的核心过滤器
spring security 加载时会初始化 DefaultSecurityFilterChain
public final class DefaultSecurityFilterChain implements SecurityFilterChain {
private static final Log logger = LogFactory.getLog(DefaultSecurityFilterChain.class);
private final RequestMatcher requestMatcher;
private final List<Filter> filters;
public DefaultSecurityFilterChain(RequestMatcher requestMatcher, List<Filter> filters) {
logger.info("Creating filter chain: " + requestMatcher + ", " + filters);
this.requestMatcher = requestMatcher;
this.filters = new ArrayList<Filter>(filters);
}
...
}
debug可以看到启动时加载的过滤器,其中 JwtAuthenticationTokenFilter 是我们项目当中自定义的 jwt 登录的过滤器,MyFilterSecurityInterceptor 是我们项目中用来做url权限匹配的过滤器。
spring security主要的过滤器有以下这些:
- WebAsyncManagerIntegrationFilter
- SecurityContextPersistenceFilter
- HeaderWriterFilter
- CsrfFilter
- CorsFilter
- LogoutFilter
- UsernamePasswordAuthenticationFilter
- RequestCacheAwareFilter
- SecurityContextHolderAwareRequestFilter
- AnonymousAuthenticationFilter
- SessionManagementFilter
- ExceptionTranslationFilter
- FilterSecurityInterceptor
SecurityContextPersistenceFilter
是过滤链的开始,它会确认当前用户的认证信息,放入 SecurityContextHolder 当中,创建 SecurityContext ,请求结束以后会清除该信息。
WebAsyncManagerIntegrationFilter
源码注解是说:
Provides integration between the {@link SecurityContext} and Spring Web's指的是将 WebAsyncManager 与 SecurityContext 做了集成,如果用到 spring mvc 中的异步请求,也能获取到用户上下文认证信息。
HeaderWriterFilter
往请求的 Header 中添加一些信息。
CsrfFilter
用于防止csrf攻击,通过客户端的 token 与服务端的 token 比对来判断请求。
CorsFilter
用于处理跨域请求。
LogoutFilter
匹配登出请求,默认为 /logout,清理认证信息。
UsernamePasswordAuthenticationFilter
匹配登录请求,默认为 /login 的 POST 请求,用来封装表单提交的用户名密码,封装成 UsernamePasswordAuthenticationToken
RequestCacheAwareFilter
用来缓存request请求
SecurityContextHolderAwareRequestFilter
针对不同版本,对 ServletRequest 做了包装
AnonymousAuthenticationFilter
匿名用户过滤器,如果未登录,会创建一个 Principal 为 ROLE_ANONYMOUS 的 Authentication 放到 SecurityContextHolder 中。
SessionManagementFilter
用来对session做一些处理,持久化用户登录信息,可以用来限制同一账号的会话个数
ExceptionTranslationFilter
异常过滤,处于整个链后部,用来转化访问异常 AccessDeniedException 和认证异常 AuthenticationException
FilterSecurityInterceptor
用于判断和处理请求访问需要的权限,角色等信息。