如何在JWT令牌中存储用户权限的最佳实践是什么?

3
我们的系统架构类似于管理员可以在用户级别上分配权限。我们使用JWT令牌进行授权,以前我们使用角色,在服务器端将角色添加到有效载荷中,检查该角色并根据需要允许/禁止,而无需访问数据库。但是当我们在JWT令牌中添加权限时,其有效载荷过重,影响了网络流量。那么我的问题是如何处理JWT令牌中的用户权限是最佳实践?

你尝试过压缩JWT吗? - Leponzo
2个回答

3

我认为这个问题没有“最佳实践”,因为将用户权限存储在JWT中似乎不明智,原因如下:

由于JWT必须包含执行请求所需的所有信息,如果在任何时候删除了用户的某些权限,只要他的JWT未过期,他仍将拥有这些权限一段时间。也就是说,采用你描述的方法,添加或删除用户的权限不会立即生效,因此需要开发机制,以使这些更改的效果是立即的。此外,我认为用户的权限可以被归类为敏感信息,不建议将敏感信息存储在JWT中(因为任何人都可以看到它)。

如果您想继续这样做,可以为权限分配标识符(例如小数字),并将这些标识符和权限存储在服务器的RAM中(例如使用字典或哈希表)。最后,在JWT中,您只需要存储权限的标识符,从而尽可能节省空间。这样就无需访问数据库。


1
如果您使用JWT而不是某种基于会话的旧框架,则有两个选择:
1. 在JWT中存储权限。正如指出的那样,这样做存在两个主要问题。首先,它可能很快就会过期。其次,根据应用程序中的权限数量,它可能会使JWT变得臃肿。此外,对于多租户应用程序,现在在飞行中切换租户变得更加困难。因为现在每当用户更改租户时,您需要重新发行令牌(以某种方式强制注销/登录)。
2. 通过网络调用到服务器(可能是登录服务器)来处理权限,该服务器远程处理授权。这增加了开销但保持响应性。唯一的缺点实际上是网络流量。听起来好像有办法解决这个问题,但实际上并没有,人们已经接受了大量的额外流量。
在我看来,只需做最少的事情即可。JWT过期的临时解决方法包括短刷新计时器。还有一些方法可以处理臃肿的JWT,例如从枚举标志创建的字符串。如果您不需要立即刷新权限或需要大量权限,则从实用性的角度来看,在JWT中放置授权数据没有任何问题。
如果上述不适用,则需要设置网络调用系统来处理授权。理想情况下,这比http网络调用更快/更轻。
例如,我使用gRPC调用。您可以在https://github.com/Perustaja/PermissionServerDemo中查看/运行示例工作存储库。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接