如何在Spring Security中对某些路径应用自定义过滤器而不是其他路径?



我正在构建一个RESTful服务器,我需要对某些路径应用自定义过滤器,但不需要对其他路径应用,但是我做错了什么。这是我的安全配置类:

@Configuration
@EnableWebSecurity
public class AppSecurityConfig extends WebSecurityConfigurerAdapter {
private final CustomFilter customFilter;
@Autowired
public AppSecurityConfig(CustomFilter filter) { customFilter = filter; }
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/auth/user/**")
.addFilterBefore(customFilter, UsernamePasswordAuthenticationFilter.class);
}
}

根据我所读到的,过滤器将应用于以/auth/user开头的任何路径,但不应用于/auth/admin。但是我的过滤器日志告诉我过滤器被应用到我发出的任何请求。

我不需要担心身份验证,因为我的服务器只对一个后端应用程序可见,它需要一个密钥来连接。但是我需要这个过滤器正常工作。

附录:为了清晰起见,我在类上添加了注释。我还应该提到过滤器扩展了OncePerRequestFilter:

@Component
public class CustomFilter extends OncePerRequestFilter {
private static final Logger log = LoggerFactory.getLogger(CustomFilter.class);
@Override
protected  void doFilterInternal(
final HttpServletRequest request,
final HttpServletResponse response,
final FilterChain filterChain
) throws ServletException, IOException {
log.trace("Executing CustomFilter");
filterChain.doFilter(request, response);
}
}

您的过滤器正在应用于每个请求,因为它可能是bean(用@Component注释)。

当您将Filter注册为bean时,Spring Boot会自动拾取它并将其放入过滤器链中,注意这不是Spring Security的SecurityFilterChain

为了避免这种情况,不要将您的自定义过滤器注册为bean,只需使其成为一个常规Java对象并通过.addFilterBefore(customFilter, UsernamePasswordAuthenticationFilter.class);注册,这样Filter将只存在于SecurityFilterChain中。

最新更新