Spring WebFlux OAuth2资源服务器匿名端点配置及访问被拒排查
解决方案
1. 公共匿名端点的标准配置(WebFlux OAuth2资源服务器)
- 核心规则:精确路径规则必须放在通配规则之前,直接给目标路径绑定
permitAll() - 必加坑点:Spring默认错误端点
/error必须单独配置permitAll(),否则访问公共端点触发异常时会被拦截
正确配置代码
@Bean SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { http .authorizeExchange(exchanges -> exchanges // 1. 公共端点(放最前面,精确匹配) .pathMatchers("/init").permitAll() // 2. 业务授权端点 .pathMatchers("/message/**").hasAuthority("SCOPE_message:read") // 3. 错误端点(必加,否则异常时被拦截) .pathMatchers("/error").permitAll() // 4. 其他所有请求必须认证(放最后) .anyExchange().authenticated() ) .oauth2ResourceServer(oauth2 -> oauth2.jwt(withDefaults())); return http.build(); }
2. 你当前Access Denied的直接原因
- 从调试日志可确认:实际被拦截的是
/error路径,不是/init- 访问
/init时触发了异常(如404、500),Spring自动转发到默认错误端点/error - 原配置未给
/error加permitAll(),被anyExchange().authenticated()规则拦截
- 访问
- 额外异常:你贴的日志属于Servlet栈(Spring MVC)(出现
http-nio-*线程、FilterSecurityInterceptor),但你使用的是WebFlux栈(基于Netty,用WebFilter),需排查:- 是否误引入
spring-boot-starter-web依赖,导致Spring Boot自动切换到Servlet栈 - 是否贴错了其他项目的日志
- 是否误引入
补充说明
- 路径匹配顺序:Spring Security WebFlux的
pathMatchers按从上到下顺序匹配,第一个命中的规则生效,严禁将anyExchange()放在其他规则之前 - 匿名访问逻辑:
permitAll()不校验认证状态,即使是匿名用户(AnonymousAuthenticationToken)也能访问,与isAuthenticated()表达式无关
内容的提问来源于stack exchange,提问作者naturzukunft
相关产品推荐
相关产品推荐

