本文内容来自王松老师的《深入浅出Spring Security》,自己在学习的时候为了加深理解顺手抄录的,有时候还会写一些自己的想法。
在Spring Security中,认证和授权等功能都是基于过滤器来完成的。在引入Spring Security依赖之后开发者不做任何配置时Spring Security会为我们加载一部分过滤器:
- SecurityContextPersistenceFilter:在请求处理之前将安全信息加载到SecurityContextHolder中方便后续使用。请求结束后,在擦除SecurityContextHolder中的信息。
- CsrfFilter:处理CSRF攻击
- LogoutFilter:处理注销登录
- UserNamePasswordAuthenticationFilter:处理表单登录
- DefaultLoginPageGeneratingFilter:配置默认登录页面
- DefaultLogoutPageGeneratingFilter:配置默认注销页面
- BasicAuthenticationFilter:处理HttpBasic登录
- 还有很多........
开发者所见到的Spring Security提供的功能都是通过过滤器来实现的,这些过滤器按照既定的优先级排列,最终形成一个过滤器链。开发者也可以自定义过滤器,并通过@Order注解去调整自定义过滤器链中的位置。需要注意的是,默认过滤器并不是直接放在原生Web项目中的原生过滤器链中,而是通过一个FilterChainProxy嵌入到Web原生项目的原生过滤器链中:
在Spring Security中这样的过滤器链不仅仅只有一个,可能会存在有多个。如下图,当存在多个过滤器链时需要指定他们的优先级,当请求达到之后会从FileterChainProxy中进行分发,先和那个过滤器链匹配上就先用哪个过滤器链进行处理。等系统存在多个不同认证体系时,那么使用多个过滤器链就非常有效。
FilterChainProxy作为一个顶层的管理者,将统一管理Security Filter。FilterChainProxy本身将通过Spring框架提供的DelegatingFilterProxy整合到原生过滤器链中,如下图: