我们的系统架构类似于管理员可以在用户级别上分配权限。我们使用JWT令牌进行授权,以前我们使用角色,在服务器端将角色添加到有效载荷中,检查该角色并根据需要允许/禁止,而无需访问数据库。但是当我们在JWT令牌中添加权限时,其有效载荷过重,影响了网络流量。那么我的问题是如何处理JWT令牌中的用户权限是最佳实践?
我认为这个问题没有“最佳实践”,因为将用户权限存储在JWT中似乎不明智,原因如下:
由于JWT必须包含执行请求所需的所有信息,如果在任何时候删除了用户的某些权限,只要他的JWT未过期,他仍将拥有这些权限一段时间。也就是说,采用你描述的方法,添加或删除用户的权限不会立即生效,因此需要开发机制,以使这些更改的效果是立即的。此外,我认为用户的权限可以被归类为敏感信息,不建议将敏感信息存储在JWT中(因为任何人都可以看到它)。
如果您想继续这样做,可以为权限分配标识符(例如小数字),并将这些标识符和权限存储在服务器的RAM中(例如使用字典或哈希表)。最后,在JWT中,您只需要存储权限的标识符,从而尽可能节省空间。这样就无需访问数据库。