基于JWT的API授权:如何拦截用户B越权访问用户A的特定Item?
阻止用户B删除用户A所属Item的最优授权拦截方案
核心要解决的是资源所有权的细粒度校验——用户B虽然有调用DELETE /item/{id}接口的权限,但没有操作用户A创建的Item的权限,网关层的JWT和接口权限校验无法覆盖这个场景,最优方案如下:
首选方案:业务服务层增加资源归属校验
当用户B发送DELETE /item/1请求时,按以下步骤处理:
- 从请求携带的JWT中解析出用户B的唯一标识(比如
user_id); - 业务服务查询数据库,获取Item 1的创建者ID(即用户A的
user_id); - 对比当前用户ID与Item创建者ID:若不一致,直接返回
403 Forbidden状态码,拒绝请求;若一致,则执行删除操作。
为什么这是最优解?
- 符合职责分离原则:网关只负责通用校验(JWT合法性、接口权限、限流等),资源归属属于业务逻辑,放在业务层更合理,避免网关耦合业务细节;
- 数据可靠:直接从数据库获取归属信息,不会出现权限数据不一致的问题;
- 改动成本低:不需要修改网关配置,只需要在业务接口的逻辑前增加一段归属校验代码,快速落地。
可选优化方向
- 性能优化:把Item的创建者ID缓存到Redis等缓存组件中,避免每次校验都查询数据库,提升接口响应速度;
- 多服务场景适配:如果是微服务架构,可以单独搭建授权服务,基于ABAC(基于属性的访问控制)模型,业务服务调用授权服务校验“当前用户是否拥有该Item的删除权限”,实现授权逻辑的集中管理,方便后续扩展更多权限规则。
注意:不建议在网关层做这个校验,因为网关需要额外调用业务服务或数据库来获取Item归属,会增加网关的复杂度和性能开销,违背网关“轻量通用”的设计初衷。
内容的提问来源于stack exchange,提问作者Jingon Park
相关产品推荐
相关产品推荐

