显式授权中的数据重复

Duplication of data in explicit authorization

我们网站上当前的授权策略与我们的 RDB 模式非常紧密地结合在一起 - 这在某些方面是一件好事,因为这意味着用户可用的权限完全符合他应该拥有的权限,假设正确的解释的数据。因此,当我们查询授权时,我们询问的是外国 key/m2m 关系。

我认为这有两个主要问题:首先,解释关系数据比从单独的 table 读取显式权限要困难得多。我看到的更大问题是这无法扩展。随着应用程序的发展,我们的权限检查已经从跨三个 table 的单个查询变为跨十个或更多 table 的多个查询。

我在很多地方看到的解决此问题的策略是显式授权(例如,基于角色或声明)。因为这种东西很简单,只要贴一个table,就显得更简单、更快、扩展性更好。困扰我的是:如何避免数据重复?

例如,我有一个拥有设计的用户。目前这是通过外键完成的。在切换到显式授权时,我会将用户的 ID 添加到包含设计 ID 和类型的 table 中。我也应该删除外键吗?权限相关的关系应该始终由权限 table 调解,还是应该在关系表示和权限 table 之间复制数据?

似乎转向显式授权的缺点之一可能包括性能,尤其是在需要服务调用或其他东西才能完全发现权限的情况下。

我认为你的角色是正确的。

登录时,您应该请求您的角色作为范围。通过 API 和组 ID 为它们命名空间并不是一个糟糕的主意,如果它们适用的话。

scopes: ['forum:admin:somegroupid']

然后登录服务可以通过询问与命名空间关联的服务来验证该角色。

GET https://forum-api.company.tld/grant_scope/[user_id]?scope=forum:admin:somegroupid

然后 returns 该用户是否可以拥有该范围以及该范围的描述。然后登录服务可能会在为该请求生成的 jwt 中包含该范围。

应在路由级别验证非子选择范围(假设它是一个不特定于任何组或项目的角色)。

否则,您将不得不进行查询以查看该服务是否表示允许用户 ID 或包含的范围之一执行此操作。如果你不想让它成为一个外国的,Redis SETs 可能会很好 table.

我认为对于对象级别的权限,加入一个访问 table 是有意义的,但尽可能少地使用它。例如,在论坛设置中,对象级权限应该在论坛上,而不是线程或 post 级别(所有者除外,它们仅包含在数据行中)。然后可以从post->thread->forum_access加入,看能不能写出新对象

TLDR;尽可能使用角色,并将其作为在路由级别验证的范围。如有必要,使用组级别角色作为范围。仅在必要时,仅对绝对必要的对象使用最低限度的对象级权限。

编辑:这只是解决您问题的众多可能方法之一。