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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 12:07:40