第十一章 Spring Security 中的几个核心过滤器
FilterSecurityInterceptor
FilterSecurityInterceptor 负责处理 HTTP 资源的安全性,提供了适用于不同 HTTP URL 请求的配置属性,引用了 AuthenticationManager 和 AccessDecisionManager。
ExceptionTranslationFilter
ExceptionTranslationFilter 位于安全过滤器堆栈中的 FilterSecurityInterceptor 之上,它本身不执行任何实际的安全性控制,但处理安全性拦截器引发的异常。
ExceptionTranslationFilter 的另一个职责是在调用 AuthenticationEntryPoint 之前保存当前请求,这允许用户在进行身份验证之后,恢复请求。如用户用表单登录之后,通过 SavedRequestAwareAuthenticationSuccessHandler 重定向至原始的 URL。
RequestCacheFilter 的任务是,当用户被重定向到原始URL时,从缓存实际还原已保存的请求。
AuthenticationEntryPoint
如果用户请求一个安全的 HTTP 资源,但是它们没有经过身份验证,则会调用 AuthenticationEntryPoint。
AuthenticationException 或者 AccessDeniedException 将由安全拦截器在调用堆栈的下方抛出,从而触发入口点上的起始方法。这将为用户提供适当的响应,以便可以开始身份验证。
如果使用的是 LoginUrlAuthenticationEntryPoint,它将会定位到登录页面。
AccessDeniedHandler
如果用户已经通过身份验证,并访问受保护的资源。如果引发了 AccessDeniedException,那么意味着用户尝试了一个他们没有权限的操作。这种情况下,AccessDeniedHandler 将被调用。
向客户端发送一个 403(Forbidden)响应。
RequestCache接口
RequestCahce 封装了存储和检索 HttpServletRequest 实例所需的功能,默认情况下使用 HttpSessionRequestCache,它将请求存储在 HttpSession 中。
SecurityContextPersistenceFilter
SecurityContextPersistenceFilter 有两个主要任务,1.负责在 HTTP 请求之间存储 SecurityContext 内容,2. 在请求完成时清除 SecurityContextHolder。
清除存储上下文的 ThreadLocal 是必不可少的,否则线程可能会被替换到 servlet 容器的线程池中,而特定用户的 SecurityContext 仍然附加在上面。这个线程如果在后面被用到,可能会使用错误的 credentials 执行操作。
SecurityContextRepository
从 Spring Security 3.0 开始,加载和存储上下文的方法都放在 SecurityContextRepository 的策略接口上:
public interface SecurityContextRepository {
// HttpRequestResponseHolder 只是传入请求和响应对象的容易,允许使用包装类进行替换
// 加载的 SecurityCOntext 将被传递给过滤器链
SecurityContext loadContext(HttpRequestResponseHolder requestResponseHolder);
void saveContext(SecurityContext context, HttpServletRequest request, HttpServletResponse response);
}
默认由 HttpSessionSecurityContextRepository 来实现,它将 SecurityContext 存储在 HttpSession 中,参数名为 “SPRING_SECURITY_CONTEXT”。
UsernamePasswordAuthenticationFilter
这个过滤器是最常用的身份验证过滤器,也是最长被定制的过滤器,它包含了 form-login 元素所使用的实现。配置它需要三步:
- 配置 LoginUrlAuthenticationEntryPoint,使用登录页面的 URL
- 实现登录页面,JSP或MVC控制器
- 配置一个 UsernamePasswordAuthenticationFilter 在应用中
- 将过滤器的 Bean 添加到自定义的过滤器链代理中
Authentication Success and Failure
过滤器调用 AuthenticationManager 来处理每个身份验证请求,成功的身份验证由 AuthenticationSuccessHandler 策略接口来处理,失败的身份验证由 AuthenticationFailureHandler 策略接口来处理。
该过滤器允许自定义失败成功处理器,包含有 SimpleUrlAuthenticationSuccessHandler、SavedRequestAwareAuthenticationSuccessHandler、SimpleUrlAuthenticationFailureHandler、ExceptionMappingAuthenticationFailureHandler、DelegatingAuthenticationFailureHandler、AbstractAuthenticationProcessingFilter 等实现。或者你可以选择自定义一个自己的失败或成功处理器。