Skip to content

Spring Security 中的过滤器链

Spring Security 使用一系列的过滤器来处理 HTTP 请求的安全性。这些过滤器按照特定的顺序排列,形成一个过滤器链,用于拦截和处理进入应用的每个请求。

过滤器链的基本组成

过滤器链由多个过滤器组成,包括但不限于:

  1. ChannelProcessingFilter:决定请求是否通过HTTP或HTTPS。
  2. SecurityContextPersistenceFilter:负责加载或创建 SecurityContext,并将其绑定到当前线程。
  3. LogoutFilter:处理用户的登出请求。
  4. BasicAuthenticationFilter:处理 Basic Authentication 的认证。
  5. UsernamePasswordAuthenticationFilter:处理基于表单的登录。
  6. RememberMeAuthenticationFilter:处理“记住我”功能。
  7. ConcurrentSessionFilter:管理用户会话。
  8. AnonymousAuthenticationFilter:如果用户未认证,提供匿名身份。
  9. SessionManagementFilter:处理会话管理。
  10. ExceptionTranslationFilter:将异常转换为响应码或重定向到错误页面。
  11. FilterSecurityInterceptor:最后的过滤器,执行访问控制决策。

过滤器链的执行流程

当一个请求到达时,它首先被最前面的过滤器处理,然后依次传递给下一个过滤器,直到最后一个过滤器(通常是 FilterSecurityInterceptor)。每个过滤器都有机会决定是否应该允许请求继续前进,或者立即结束请求。

例如,如果一个请求被 UsernamePasswordAuthenticationFilter 拦截,并且用户凭据无效,则该过滤器会阻止请求进一步处理,直接返回一个错误响应。

自定义过滤器链

Spring Security 允许你自定义过滤器链,以适应不同的安全需求。你可以添加、移除或重新排序过滤器。这通常通过配置 HttpSecurity 对象实现,如下所示:

java
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
        
        // 添加自定义过滤器
        http.addFilterBefore(myCustomFilter(), UsernamePasswordAuthenticationFilter.class);
    }
}

在这个例子中,myCustomFilter() 是你自定义的过滤器,它将在 UsernamePasswordAuthenticationFilter 之前执行。

总之,理解 Spring Security 中的过滤器链对于设计和实现安全的 web 应用程序至关重要。通过自定义过滤器链,你可以灵活地满足特定的应用安全需求。