sa-token + spring cloud gateway 过滤器顺序问题

4 月 13 日
 nitouge

执行顺序(从小到大): 1.TRACE_ID_ORDER - 生成 TraceId (最高优先级) 2.BLACK_LIST_ORDER - 黑名单检查(尽早拦截) 3.REQUEST_CONTEXT_ORDER - 缓存请求体(为后续过滤器提供数据) 4.XSS_INJECTION_ORDER - XSS 注入检查 5.SQL_INJECTION_ORDER - SQL 注入检查 6.RATE_LIMITER_ORDER - 限流检查 7.API_LOG_ORDER - API 日志记录 8.AUTH_ORDER - Sa-Token 认证鉴权 9.JWT_BLACKLIST_ORDER - JWT 黑名单检查 10.FORWARD_AUTH_ORDER - 转发认证信息 11.业务处理 12.RESPONSE_CONTEXT_ORDER - 缓存响应体 13.REMOVE_CONTEXT_ORDER - 清理上下文(最低优先级)

Auth 是 WebFilter ( SaReactorFilter )”这一点决定了它一定会先于所有 GlobalFilter 执行。也就是说,按你写的序列把 Auth 放在第 8 位( TraceId 、黑名单、注入之后)是做不到的,除非把认证改造成 GlobalFilter (不走 SaReactorFilter )。所以:

如果保留 Sa-Token 的 SaReactorFilter (推荐做法),实际顺序一定是:WebFilter 阶段先认证,再进入 GlobalFilter 阶段做 TraceId/黑名单/注入/限流/日志等。 你给出的序列可作为 GlobalFilter 之间的相对顺序,但无法跨越 WebFilter 与 GlobalFilter 的边界 如果认证( Auth )放在最前面,未认证或非法请求可能直接被拦截,导致 API 日志和上下文处理没有执行 我这个 filter 顺序是否有问题,下面是整理的部分

Filter 类型 依赖 推荐 order
CORS WebFilter - Integer.MIN_VALUE
Auth(Sa-Token) WebFilter - -101
Actuator WebFilter - -100 (可选)
TraceId GlobalFilter 无 Integer.MIN_VALUE
RequestContext GlobalFilter TraceId Integer.MIN_VALUE+20
Blacklist GlobalFilter/WebFilter 可依赖 Auth Integer.MIN_VALUE+10(GlobalFilter)
XSS Injection GlobalFilter RequestContext Integer.MIN_VALUE+30
SQL Injection GlobalFilter RequestContext Integer.MIN_VALUE+40
Rate Limiter GlobalFilter RequestContext / IP Integer.MIN_VALUE+50
API Log GlobalFilter RequestContext Integer.MIN_VALUE+60
JWT Blacklist GlobalFilter Auth -90
Forward Auth GlobalFilter Auth -80
Business 路由转发 - -
ResponseContext GlobalFilter RequestContext WRITE_RESPONSE_FILTER_ORDER-1
RemoveContext GlobalFilter 全局上下文 Integer.MAX_VALUE
2342 次点击
所在节点    Java
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/1205576

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX