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方法。以下是简化后的伪代码:

浙公网安备 33010602011771号