如何设计用户权限处理数据库?



我们的一个项目遇到了一个小问题,其中两个投资者是建筑师,而且......就像生活中通常的情况一样,他们并没有真正与一些想法相处融洽。两人对以前的项目都有不同的经验,似乎他们看不起对方的想法。是的,我就是其中之一。

关于如何在我们的一个项目中定义用户权限处理,我们有一个争论。

一个想法是具有权限的表,收集权限集的角色,然后是定义了角色的用户。

User
user_id
role_id
Role
role_id
permission_id
Permission
permission_id

另一方建议使用带有定义权限的列的表来做到这一点:

User
user_id
role_id
Role
role_id
can_do_something
can_do_something_else
can_do_something_even_different

我对第一种选择的看法是,维护起来要便宜得多: 添加单个权限意味着它只是代码中权限的一个插入 + 处理。

如果是其他情况(对我来说),这意味着您必须更改数据库,更改处理数据库的代码,最重要的是,添加代码来处理权限。

但也许我错了,我没有看到其他解决方案的一些可能的好处。

我一直认为前者是处理它的标准,但我被告知这是主观的,在数据库中进行更改只是运行脚本的问题(对我来说,这意味着脚本必须添加到部署中,必须在每个数据库上运行,并且在迁移的情况下必须"记住"等)。

我知道这个问题可能是基于意见的,但我有点希望,这确实是一个标准和良好实践的问题,而不是主观意见。

我发布了一些其他问题作为对你原始问题的评论。

即使你有一个完全扁平的角色设置,我也想不出选择第二个建议的理由。正如你所说,改变某些东西需要修改代码和数据结构。

您的同事提出的是一种非规范化,只有在您需要优化处理大量数据的速度时才可以防御。在处理角色时通常不是这种情况。

(例如,LDAP 或其他通用单点登录模型采用更接近您的第一个解决方案的方法,因为即使在大型组织中,用户数也始终比角色数大至少一个数量级)。

即使你正在设计一个Facebook替代品(你可能有数十亿用户),你也不太可能需要超过几个角色,所以这将是一个过早优化的情况(并且 - 很可能 - 通过优化错误的部分而变得更糟)。


在更一般的意义上,我强烈建议阅读RBAC维基百科文章,了解此类问题的标准方法。

最新更新