我正在构建一个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);
}
}
1条答案
按热度按时间wbgh16ku1#
您的过滤器将应用于每个请求,因为它可能是一个bean(用
@Component
注解)。当您将一个
Filter
注册为bean时, Boot 会自动拾取它并将其放入过滤器链中,请注意,这不是SpringSecurity的SecurityFilterChain
。为了避免这种情况,不要将自定义过滤器注册为bean,只需将其设置为常规Java对象并通过
.addFilterBefore(customFilter, UsernamePasswordAuthenticationFilter.class);
进行注册,这样Filter
将仅出现在SecurityFilterChain
内部。