spring-security 在Spring Security中,如何将自定义过滤器应用于某些路径,而不应用于其他路径?

alen0pnh  于 2022-11-11  发布在  Spring
关注(0)|答案(1)|浏览(201)

我正在构建一个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);
  }
}
wbgh16ku

wbgh16ku1#

您的过滤器将应用于每个请求,因为它可能是一个bean(用@Component注解)。
当您将一个Filter注册为bean时, Boot 会自动拾取它并将其放入过滤器链中,请注意,这不是SpringSecurity的SecurityFilterChain
为了避免这种情况,不要将自定义过滤器注册为bean,只需将其设置为常规Java对象并通过.addFilterBefore(customFilter, UsernamePasswordAuthenticationFilter.class);进行注册,这样Filter将仅出现在SecurityFilterChain内部。

相关问题