一、核心拦截器详细说明
1.WebAsyncManagerIntegrationFilter
根据请求封装获取WebAsyncManager
从WebAsyncManager获取/注册SecurityContextCallableProcessingInterceptor
2.SecurityContextPersistenceFilter
先实例SecurityContextHolder->HttpSessionSecurityContextRepository(下面以repo代替)
作用:其会从Session中取出已认证用户的信息,提高效率,避免每一次请求都要查询用户认证信息
根据请求和响应构建HttpRequestResponseHolde
repo根据HttpRequestResponseHolder加载context获取SecurityContext
SecurityContextHolder将获得到的SecurityContext设置到Context中,然后继续向下执行其他过滤器
finally-> SecurityContextHolder获取SecurityContext,然后清除,
并将其和请求信息保存到repo,从请求中移除FILTER_APPLIED属性
3.HeaderWriterFilter
往该请求的Header中添加相应的信息,在http标签内部使用security:headers来控制
4.CsrfFilter
csrf又称跨域请求伪造,攻击方通过伪造用户请求访问受信任站点。
对需要验证的请求验证是否包含csrf的token信息,如果不包含,则报错。
这样攻击网站无法获取到token信息,则跨域提交的信息都无法通过过滤器的校验。
5.LogoutFilter
匹配URL,默认为/logout
匹配成功后则用户退出,清除认证信息
6.RequestCacheAwareFilter
通过HttpSessionRequestCache内部维护了一个RequestCache,用于缓存HttpServletRequest
7.SecurityContextHolderAwareRequestFilter
针对ServletRequest进行了一次包装,使得request具有更加丰富的API
8.AnonymousAuthenticationFilter
当SecurityContextHolder中认证信息为空,则会创建一个匿名用户存入到SecurityContextHolder中。
9.SessionManagementFilter
securityContextRepository限制同一用户开启多个会话的数量
SessionAuthenticationStrategy防止session-fixation protection attack(保护非匿名用户)
10.ExceptionTranslationFilter
ExceptionTranslationFilter异常转换过滤器位于整个springSecurityFilterChain的后方,
用来转换整个链路中出现的异常
此过滤器的作用是处理中FilterSecurityInterceptor抛出的异常,然后将请求重定向到对应页面,
或返回对应的响应错误代码
11.FilterSecurityInterceptor
获取到所配置资源访问的授权信息
根据SecurityContextHolder中存储的用户信息来决定其是否有权限
主要一些实现功能在其父类AbstractSecurityInterceptor中
12.UsernamePasswordAuthenticationFilter
表单认证是最常用的一个认证方式,一个最直观的业务场景便是允许用户在表单中输入用户名和密码进行登录,
而这背后的UsernamePasswordAuthenticationFilter,在整个Spring Security的认证体系中则扮演着至关重要的角色
二、框架的核心组件
SecurityContextHolder:提供对SecurityContext的访问
SecurityContext:持有Authentication对象和其他可能需要的信息
AuthenticationManager :其中可以包含多个AuthenticationProvider; ProviderManager对象为AuthenticationManager接口的实现类
AuthenticationProvider:主要用来进行认证操作的类 调用其中的authenticate()方法去进行认证操作
Authentication:Spring Security方式的认证主体
GrantedAuthority:对认证主题的应用层面的授权,含当前用户的权限信息,通常使用角色表示
UserDetails:构建Authentication对象必须的信息,可以自定义,可能需要访问DB得到
UserDetailsService:通过username构建UserDetails对象,通过loadUserByUsername根据userName获取UserDetail对象