Spring Security 6.0 AuthorizationFilter默认shouldFilterAllDispatcherTypes合理性疑问
设计初衷:迁移兼容性优先
Spring Security 6.0引入AuthorizationFilter替代旧的FilterSecurityInterceptor,默认将shouldFilterAllDispatcherTypes设为true,核心目的是兼容旧组件的行为:
- 旧版
FilterSecurityInterceptor默认会拦截所有DispatcherType(包括REQUEST、ERROR、FORWARD等) - 保持默认值一致,能让迁移的项目在不额外配置的情况下,尽可能延续原有权限控制逻辑,降低大版本升级的迁移成本和意外风险。
为何出现矛盾与异常场景
你遇到的注册接口错误场景返回401的问题,本质是shouldFilterAllDispatcherTypes=true与observeOncePerRequest等默认值的逻辑冲突:
observeOncePerRequest默认true,要求同一个请求只执行一次权限校验- 当参数校验失败触发
ERROR类型的dispatch时,AuthorizationFilter会再次拦截该请求,但此时原请求的匿名授权规则(针对REQUESTdispatch)并未覆盖ERROR场景,导致被判定为未授权,返回401。 - 添加
.shouldFilterAllDispatcherTypes(false)后,Filter仅拦截REQUEST等核心dispatch类型,ERRORdispatch不再被权限校验拦截,自然返回正确的400状态码。
权限绕过漏洞的背景与修复
你提到的权限绕过问题,是Spring Security 6.0早期版本中,shouldFilterAllDispatcherTypes=true搭配某些请求转发场景时的逻辑漏洞。但需要明确:
- Spring Security团队在后续版本(如6.1及以上)中,已经将
shouldFilterAllDispatcherTypes的默认值调整为false,同时修复了相关漏洞逻辑 - 这个默认值的问题属于版本迭代中的过渡性权衡,并非长期设计。
默认设置的合理性总结
- 迁移阶段的兼容性妥协:大版本升级时,优先保证现有项目的平滑迁移是核心目标,默认沿用旧组件行为能减少开发者的适配成本
- 可配置性弥补设计不足:框架提供了明确的配置入口(
shouldFilterAllDispatcherTypes()),允许开发者根据自身场景调整规则,文档也后续补充了相关场景的配置指引 - 后续版本的迭代修正:团队已通过调整默认值和修复漏洞,在安全性与兼容性之间重新平衡,后续版本的默认配置已更合理。
内容的提问来源于stack exchange,提问作者Jürgen Wißkirchen
相关产品推荐
相关产品推荐

