Spring Security:(四)启动时初始化FilterChainProxy

Spring Security 通过创建一个 FilterChainProxy 的实例来实现所有功能,FilterChainProxy 是所有 Spring Security 功能的入口,一旦 FilterChainProxy 初始化完成,Spring Security 启动也就完成了。FilterChainProxy 实现 Filter 接口,因此 FilterChainProxy 就是一个过滤器,因而可以将 Spring Security 理解为一个过滤器

FilterChainProxy功能点入口

在 Spring Security 的 spring-security-web 模块中,FilterChainProxy 在包 org.springframework.security.web 下。

复制代码
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        boolean clearContext = request.getAttribute(FILTER_APPLIED) == null;
        if (clearContext) {
            try {
                request.setAttribute(FILTER_APPLIED, Boolean.TRUE);
                doFilterInternal(request, response, chain);
            }
            finally {
                SecurityContextHolder.clearContext();
                request.removeAttribute(FILTER_APPLIED);
            }
        }
        else {
            doFilterInternal(request, response, chain);
        }
    }
复制代码

上面这个方法是 FilterChainProxy 功能点的入口,当请求到达调用 controller 层之前,会被 FilterChainProxy 拦截,然后进入上面所示的 doFilter 方法,因而如果要调试 Spring Security 在此方法上打断点是最好的。

FilterChainProxy初始化过程

既然 Spring Security 一切功能点都是从 FilterChainProxy 开始,因而当项目启动时,FilterChainProxy 的实例也创建完成了。FilterChainProxy 实例是如何被创建的?

  1. 当在 Spring Boot 项目中添加了 Spring Security 依赖后,在 spring-boot-autoconfigure.jar 中 org.springframework.boot.autoconfigure.security.servlet 包中有个 SecurityAutoConfiguration 类,这就是当项目引入 Spring Security 后 Spring Boot 会启用的安全配置类。
  2. 在 SecurityAutoConfiguration 类上的 @Import 注解引入了 WebSecurityEnablerConfiguration 类。
  3. 在 WebSecurityEnableConfiguration 上有个注解 @EnableWebSecurity。
  4. 查看注解 @EnableWebSecurity 源码,可以看到其又通过 @Import 注解引入了 WebSecurityConfiguration 类。

在 WebSecurityConfiguration 中有两个十分重要的方法,分别是:

  1. setFilterChainProxySecurityConfigurer(...) 此方法会创建一个 WebSecurity 实例
  2. springSecurityFilterChain() 此方法会调用上一步产生的 WebSecurity 的 build() 方法,而 webSecurity.buid() 方法返回一个 FilterChainProxy 实例。

至此,FilterChainProxy 初始化就完成了。 

上面是 Spring Security 启动时的简易初始步骤。

 

posted @   colin220  阅读(969)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示