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.
相关产品推荐
相关产品推荐

