返回

Spring Security 过滤器未认证?巧用忽略匹配器轻松解决

java

Spring Security 过滤器始终处于未认证状态?巧用忽略匹配器轻松解决

作为一名经验丰富的程序员和技术作家,我常常面临解决各类复杂技术问题的挑战。最近,我遇到一个棘手的 Spring Security 配置问题,让我焦头烂额了一段时间。我迫不及待地想与大家分享我的解决方法,希望对遇到类似问题的开发者有所帮助。

问题

我在 Spring Security 中配置了一个过滤器,旨在从请求头中提取 CustomApiToken 对象并将其注入 Spring Security 上下文。然而,我希望在 Swagger UI 和 API 文档页面上禁用此过滤器,以允许访问这些页面。

遗憾的是,我尝试过的禁用过滤器的方法均以失败告终。过滤器始终在 Swagger URL 上处于活动状态,导致缺少身份验证令牌的错误。

解决方法

经过一番探索,我发现了解决此问题的关键在于将过滤器配置与忽略匹配器链接起来。以下是更新后的 Spring Security 配置:

@Override
public void configure(HttpSecurity http) throws Exception {
    http
        .csrf().disable()
        .and()
        .antMatcher("/**")
        .addFilterBefore(new AuthenticationFilter(), BasicAuthenticationFilter.class)
        .and()
        .requestMatcher(SecurityServletRequestMatchers.servletIgnoreAuthMatcher())
        .headers()
            .defaultsDisabled()
            .disable()
        .and()
        .authorizeRequests()
            .anyRequest().authenticated();
}

在这个配置中,and() 方法将过滤器配置和忽略匹配器连接在一起。这样就确保了过滤器将在所有 URL 上应用,而忽略匹配器将禁用它以忽略 Swagger URL。

步骤说明:

  1. 使用 and() 方法连接过滤器配置和忽略匹配器:
.and()
.requestMatcher(SecurityServletRequestMatchers.servletIgnoreAuthMatcher())
  1. 禁用过滤器以忽略 Swagger URL:
.headers()
    .defaultsDisabled()
    .disable()
  1. 授权所有其他请求:
.authorizeRequests()
    .anyRequest().authenticated();

结论

通过遵循这些步骤,你将能够在 Spring Security 中正确禁用过滤器,以便访问 Swagger UI 和 API 文档页面,同时仍对所有其他请求应用过滤器。

常见问题解答

1. 为什么需要使用 and() 方法?

and() 方法用于连接 Spring Security 配置的不同部分。在本例中,它用于将过滤器配置与忽略匹配器链接在一起。

2. requestMatcher() 方法的作用是什么?

requestMatcher() 方法用于指定过滤器应用于哪些 URL。在本例中,它用于指定忽略匹配器应适用于 Swagger URL。

3. headers() 方法的作用是什么?

headers() 方法用于配置 HTTP 响应头。在本例中,它用于禁用默认安全头,以允许跨域请求。

4. authorizeRequests() 方法的作用是什么?

authorizeRequests() 方法用于配置对应用程序不同部分的访问控制。在本例中,它用于授权所有其他请求,前提是用户已通过身份验证。

5. 除了 Swagger,还有哪些其他 URL 可以使用此方法忽略?

此方法可用于忽略任何需要访问权限的 URL,例如登录页面、注册页面或 API 文档页面。