Spring Security 6.0 的实现原理
Spring Security通过DefaultSecurityFilterChain
类来完成安全相关的功能,而该类本身又由其它Filter组成。默认情况下,Spring Security Starter引入了15个Filter。
1.CsrfFilter :这个Filter用于防止跨站点请求伪造攻击,这也是导致所有POST请求都失败的原因。基于Token验证的API服务可以选择关闭CsrfFilter
,而一般Web页面需要开启。
2.BasicAuthenticationFilter :支持HTTP的标准Basic Auth
的身份验证模块。
3.UsernamePasswordAuthenticationFilter :支持Form表单形式的身份验证模块。
4.DefaultLoginPageGeneratingFilter和DefaultLogoutPageGeneratingFilter :用于自动生成登录页面和注销页面。
5.AuthorizationFilter: 这个Filter负责授权模块。值得注意的是,在老版本中鉴权模块是FilterSecurityInterceptor。
SecurityFilterChain
DefaultSecurityFilterChain
类实现了SecurityFilterChain
接口,我们打开这个接口的源码,会发现它只有两个方法,matches
用于匹配特定的Http请求(比如特定规则的URL),getFilters
用于获取可用的所有Security Filter。
public interface SecurityFilterChain {
boolean matches(HttpServletRequest request); // 规则匹配
List<Filter> getFilters(); // 该FilterChain下的所有Security Filter
}
DelegatingFilterProxy
实际上,JakartaEE层面上的Filter实现是DelegatingFilterProxy
类,它在Spring Security中起到了一个重要的桥梁作用,连接了Servlet容器和Spring容器。Servlet容器不了解Spring定义的Beans,而Spring Security的大部分组件及其依赖都是注册到Spring容器中的Bean。
DelegatingFilterProxy
核心代码的主要工作就是从WebApplicationContext
获取指定名称的Filter Bean,然后委托给这个Bean的doFilter
方法。以下是简化后的伪代码: