在 RESTful API 中检查用户权限的最佳实践

Posted

技术标签:

【中文标题】在 RESTful API 中检查用户权限的最佳实践【英文标题】:Best practice to check user permission in RESTful API 【发布时间】:2019-12-28 15:02:29 【问题描述】:

我正在为我的公司开发一个内部管理系统。部分 API 路由会检查用户的角色,其余路由会检查用户的权限。

目前,我如何将用户的权限存储在 JWT 令牌中


  "user": 
    "name": "Oyster Lee",
    "role": "root",
    "image": ""
  ,
  "OMS": 2147483647,
  "WMS": 4095,
  "iat": 1566536007,
  "exp": 1567140807,
  "iss": "Test"

我的许可是使用按位运算符。但它在每个系统中最多只能使用 31 种权限。我有超过 31 个,所以需要替换按位运算符。

除此之外,在我为用户分配新的权限或角色后,他必须一次又一次地注销并登录。

我在考虑是否应该在每次向路由发送请求时检查数据库以获得用户的权限。会不会导致应用变重?有什么优点和缺点吗?顺便说一句,我是 mysql 作为我们的数据库。

前端还需要根据用户的权限或角色有条件地渲染。 我使用 Nuxt.js SPA 作为前端。

【问题讨论】:

【参考方案1】:

您正在构建的系统存在多个问题:

首先会导致角色爆炸/权限爆炸。现在您已经想到了几个角色和权限。但未来可能会有更多。您是否需要重新设计您的权限? 其次,您不能优雅地处理关系(如果访问是基于用户和对象位于同一部门/地区的事实怎么办?) 第三,您正在使用 My permission is using a bitwise operator. But it can only use up to 31 types of permission in each system. I have more than 31 so the bitwise operator will need to be replaced. 对自己的逻辑进行硬编码,这将无法扩展 最后,您必须登录/注销才能使更改生效。

您需要将授权逻辑与内部管理系统 API 分离和外部化。有一种称为基于属性的访问控制 (ABAC) 的模式可以实现这一点。使用 ABAC,您有一个基于拦截的模型,其中 Policy Enforcement Point (PEP) 拦截对您的 API 的调用并根据 Policy Decision Point (PDP) 检查是否应该允许调用者(Alice)访问他们请求的任何内容(文档、记录...)。

PDP 配置了策略,这些策略使用属性来描述可以或不可以发生的事情。例如:

如果 user.department == record.department,角色 == "manager" 的用户可以对 == "record" 类型的对象执行操作 == "view"。

编写此类策略有两个标准:alfa 和 xacml。 ABAC 架构有多种实现方式,包括开源(AuthZForce、AT&T...)和商业(Axiomatics)。一定要检查一下。我还在其他 SO 帖子(例如 this one)中写了很多关于这个问题的文章。

【讨论】:

以上是关于在 RESTful API 中检查用户权限的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

Restful API:管理员和用户范围的最佳实践

RESTful API 设计更新 1/多对多关系的最佳实践?

如何设计一个 RESTful API 来检查用户的凭据?

缓存 GET 调用的 RESTful API 结果的最佳方法

使用before_request来做权限和用户检查

Rails RESTful API + 设计 - 如何检查用户的凭据