You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring OAuth2认证服务器:如何让自定义Filter仅处理/oauth/token请求?

当然可以实现!

在Spring OAuth2 Authorization Server中,你完全可以让自定义的JWT黑名单检查Filter仅作用于/oauth/token端点,这里有几种常用的实现方式:

方法一:通过FilterRegistrationBean指定拦截路径

你不用把Filter直接加到全局过滤器链里,而是通过FilterRegistrationBean来注册自定义Filter,并明确指定它要拦截的路径:

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean<JwtBlacklistCheckFilter> jwtBlacklistFilter() {
        FilterRegistrationBean<JwtBlacklistCheckFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new JwtBlacklistCheckFilter());
        // 只拦截/oauth/token端点
        registrationBean.addUrlPatterns("/oauth/token");
        // 设置过滤器顺序,确保在OAuth2相关过滤器之前执行(可根据需求调整)
        registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE + 10);
        return registrationBean;
    }
}

这样你的自定义Filter就只会处理发往/oauth/token的请求,其他请求会直接跳过这个Filter。

方法二:在Filter内部判断请求路径

如果你的Filter已经注册到全局链里了,也可以在Filter的doFilter方法内部手动判断当前请求的路径,只对/oauth/token的请求进行处理:

public class JwtBlacklistCheckFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        String requestUri = httpRequest.getRequestURI();
        
        // 仅处理/oauth/token端点的请求
        if ("/oauth/token".equals(requestUri)) {
            // 执行JWT黑名单检查逻辑
            String authorizationHeader = httpRequest.getHeader("Authorization");
            if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {
                String jwtToken = authorizationHeader.substring(7);
                // 检查令牌是否在黑名单中
                if (isTokenBlacklisted(jwtToken)) {
                    // 如果已拉黑,返回401 Unauthorized
                    HttpServletResponse httpResponse = (HttpServletResponse) response;
                    httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                    httpResponse.getWriter().write("Token has been blacklisted");
                    return;
                }
            }
        }
        
        // 不是目标端点,直接放行
        chain.doFilter(request, response);
    }

    // 模拟黑名单检查方法,替换为你的实际逻辑
    private boolean isTokenBlacklisted(String jwtToken) {
        // 比如从Redis或数据库查询令牌状态
        return false;
    }

    // 按需实现初始化、销毁方法
}

这种方式更灵活,之后如果要调整拦截的端点,只需要修改判断条件即可。

方法三:利用Spring Security的FilterChain配置

如果你是通过Spring Security配置管理过滤器,还可以在SecurityFilterChain中针对特定端点添加自定义Filter:

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .anyRequest().authenticated()
            )
            // 针对/oauth/token端点添加自定义Filter
            .addFilterBefore(new JwtBlacklistCheckFilter(), UsernamePasswordAuthenticationFilter.class)
            .requestMatchers(request -> request.getRequestURI().equals("/oauth/token"));
        
        return http.build();
    }
}

不过这种方式需要注意过滤器的顺序和请求匹配规则,确保Filter只会应用到目标端点上。

以上几种方法都能满足你的需求,你可以根据项目架构和实际情况选最合适的一种。

内容的提问来源于stack exchange,提问作者Deniss M.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:24:48