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

Oys*_*rD3 2 authentication authorization node.js express jwt

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

目前,我在做什么是在 JWT 令牌中存储用户的权限

{
  "user": {
    "name": "Oyster Lee",
    "role": "root",
    "image": ""
  },
  "OMS": 2147483647,
  "WMS": 4095,
  "iat": 1566536007,
  "exp": 1567140807,
  "iss": "Test"
}
Run Code Online (Sandbox Code Playgroud)

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

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

我在想,每次他们向路由发送请求时,我是否应该检查数据库以获取用户的许可。会不会导致应用更重?有什么优点和缺点吗?顺便说一下,我使用 MySQL 作为我们的数据库。

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

Dav*_*ard 6

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

  • 首先会导致角色爆炸/权限爆炸。现在您已经想到了几个角色和权限。但未来可能会有更多。您是否必须重新设计您的权限?
  • 其次,你不能优雅地处理关系(如果访问是基于用户和对象在同一个部门/地区的事实呢?)
  • 第三,您正在使用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.That just won't scale硬编码自己的逻辑
  • 最后,您必须登录/注销才能使更改生效。

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

基于属性的访问控制

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

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

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