Spring Boot+Keycloak策略执行器:无令牌请求优先返回401而非403
解决无令牌请求返回403而非401的问题
核心原因
当前配置中ServletPolicyEnforcerFilter的执行顺序过早,未完成认证的请求就进入了策略执行器,而策略执行器对未认证请求直接返回403,跳过了Spring Security的认证入口处理逻辑。
解决方案
1. 调整过滤器执行顺序
将策略执行器过滤器移至Spring Security的AuthorizationFilter之后,确保只有通过认证的请求才会触发权限校验。修改securityFilterChain中的过滤器添加代码:
// 替换原有的addFilterAfter语句 http.addFilterAfter(createPolicyEnforcerFilter(), AuthorizationFilter.class);
AuthorizationFilter是Spring Security中负责校验请求是否已认证的核心组件,未携带有效令牌的请求会在这里被拦截,通过你配置的BearerTokenAuthenticationEntryPoint返回401 Unauthorized,不会进入后续的策略执行器流程。
2. 确认策略执行器配置边界
检查policy-enforcer.json,确保配置仅聚焦于权限校验:
- 不要配置
authentication-flow相关的跳转逻辑,让Spring Security全权处理认证环节 - 保持
enforcement-mode为默认的ENFORCING,仅对已认证请求执行权限检查
3. 强化认证前置校验
你的配置中已经通过anyRequest().authenticated()强制所有非白名单请求必须认证,结合调整后的过滤器顺序,未认证请求会被提前拦截,彻底避免策略执行器介入认证判断。
验证场景
修改后测试两种核心场景:
- 无令牌/无效令牌请求:返回
401 Unauthorized - 有效令牌但无对应权限:返回
403 Forbidden
内容的提问来源于stack exchange,提问作者Naqib Ali
相关产品推荐
相关产品推荐

