记录一下那天晚上的排查过程。后台管理页把删除按钮按角色隐藏了,前端判断 role 不等于 admin 就不渲染,测试用普通账号直接调 DELETE /api/docs/123,接口照样返回 200,文档被删了,网关只校验了登录态。
刚开始盯着「删除接口用 GET 也能触发」,折腾了半个多小时,排掉了。
这类报错背后常见的原因有几处,逐个排除就行。权限只做在渲染层,接口没有鉴权中间件。少数情况下是网关只校验登录态不校验角色。
另外,前端把 role 存在 localStorage,可被篡改。
第一件事是用普通账号的 token 直接调删除接口
curl -s -o /dev/null -w '%{http_code}\n' -X DELETE http://localhost:8080/api/docs/123 -H 'Authorization: Bearer $USER_TOKEN'
随后确认后端有没有角色校验
grep -rn 'require_role\|is_admin' app/api/
再往下在路由层加统一鉴权装饰器
python -c "print('@require_role(\"admin\")')"
等前面都确认过,再用普通账号复测应返回 403
curl -s -o /dev/null -w '%{http_code}\n' -X DELETE http://localhost:8080/api/docs/123 -H 'Authorization: Bearer $USER_TOKEN'
怎么算真的好了,看的是同一批现象。普通账号调删除接口返回 403,管理员账号仍能删除,前端隐藏按钮与后端结果一致,审计日志里记录了拒绝原因。
补一句。前端隐藏只是体验,不是权限;所有写接口都要在服务端做角色校验,网关的登录态校验不能替代业务鉴权。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
