用户角色权限数据库设计

Posted

技术标签:

【中文标题】用户角色权限数据库设计【英文标题】:User Roles Permissions Database Design 【发布时间】:2016-03-30 16:08:19 【问题描述】:

所以,我为UsersRolesPermissions 设计了以下数据库。 Users * ---- * Roles Roles * ---- * Permissions 如您所见,User 可能担任多个角色。 Role 有很多权限。但它有一个缺点:如果我想授予特定的特殊权限 Usersome 特定权限,而该权限不在用户的现有角色中?想象一下我有角色“经理”。 John Doe 是经理。现在,我想授予约翰“查看活动”的权限。 “查看活动”是“观察者”角色,而不是“经理”角色。虽然我想让约翰“查看活动”,但我不想给他“观察者”角色,因为它也有其他权限。 解决此问题的一种方法是将与每个权限对应的角色与现有角色一起使用。每当约翰需要“查看活动”权限时,我都会授予他角色“查看活动角色”,其中仅包含一项权限。 任何其他数据库设计/想法?建议?谢谢

【问题讨论】:

【参考方案1】:

我相信你的想法是正确的,这是一个很好的设计。

一个建议是,由于数据库组织良好,请尝试让用户仅通过角色获得权限。如果有人直接想要获得许可,只需创建一个专门的角色即可。

就像你提到的John Manager 没有See Activity 的例子:这个See Activity 权限可能与Observers 有关,但ObserversSee Activity 有更多的权力。在这种情况下,您的设计允许您创建一个名为ActivityObservers 的新角色,该角色拥有See Activity 的权限。这样John Manager 可以同时担任ManagerActivityObservers 角色。

我相信您已经掌握了索引。运行一些场景来回答以下问题:John Manager 离开时会发生什么?您如何轻松说出John Manager 拥有哪些权限?任何表中是否有 Active 标志?有一个有用吗?这种活动标志可能有助于快速禁用每个用户的帐户、角色或权限。

您是否需要一个审核表来说明何时以及通过角色向哪个用户授予了哪些权限?如果是这样,基于触发器的审计可能会有所帮助。类似的场景 - Jim Manager 想要与 John Manager 完全相同的权限 - 这可以多快完成?

总的来说,你有一个很好的概念!

【讨论】:

【参考方案2】:

让较小的角色成为较大角色的子集是个好主意。 这可以通过下面的SQL轻松确定

select count(permissions) from tblPermission where role='observer'

这将给出权限/权限的总数 角色成员有。经理的角色也有相同的查询

select count(permissions) from tblPermission where role='manager'

从逻辑上讲,如果经理角色是观察者类的超类,那么 经理应该能够看到与观察者一样的活动。

【讨论】:

以上是关于用户角色权限数据库设计的主要内容,如果未能解决你的问题,请参考以下文章

用户角色权限数据库设计

用户角色权限数据库设计

权限设计的总结

RBAC用户权限管理数据库设计

用户权限管理数据库设计(RBAC)

[数据库设计]用户和角色:通用权限管理系统数据库表结构如何设计?