知识卡片

端点鉴权不等于数据行级隔离

专业/工作 · 526.c.4

内容

“这个用户能不能访问 /orders 这个端点”和”这个用户能不能看到这一条具体的订单数据”是两层完全不同的授权检查,前者是端点级别的 RBAC,靠角色判断能不能调用某个接口就够了;后者是数据级别的所有权隔离,必须在查询逻辑本身里显式按当前用户过滤,比如把默认的”查所有订单”换成”只查这个用户创建的订单”,并且从认证上下文里取出当前用户名传进这条查询。端点鉴权做得再严格,也保证不了数据隔离——如果仓储接口上还留着一个没加过滤条件的 findAll() 方法,未来某处代码不小心调用了它,那条本该只属于订单本人的数据照样会被泄露给别人。发散:这提醒了一个容易被忽略的授权盲区——很多系统只在”能不能调用这个接口”这层把关,却假设”调用成功后返回的数据自然就是该返回的那部分”,但这个假设只有在每一条数据访问路径都显式做了归属过滤时才成立,少加一个过滤条件、多暴露一个未受限的仓储方法,都是数据泄露的真实入口。

参考来源

《Cloud Native Spring in Action》第12章《Security: Authorization and auditing》