最佳用户角色权限数据库设计实践?

40
我想为 Web 应用程序设计数据库,使得用户能够根据赋予的角色权限访问特定的选项卡。
目前我已经创建了两个表 USER_TABLE 和 USER_ROLES。USER_TABLE 表具有以下字段:
- id(主键) - user_name - password - first_name - last_name - created_date - role_id_fk(外键)
USER_ROLES 表具有以下字段:
- id(主键) - role_name(例如 ADMIN、TAB1_USER、TAB2_USER 等) - created_date 在这里,拥有 "ADMIN" 角色的用户可以看到所有选项卡,其他用户只能访问特定的选项卡。
我的问题是,我是否需要创建一个 USER_PERMISSIONS 表,在 USER_ROLES 表中添加外键,该表具有以下字段:
- id(主键) - permission_type(ALL、TAB1、TAB2...等)
还是应该在代码级别上管理这个?这两种方法各有什么利弊?

4
这取决于您的要求。如果您只想实现静态权限,即在运行时无法更改的权限,则将应用程序的所有功能与代码中的角色绑定。优点-易于实现,缺点-每次更改权限都需要更改代码。如果您想要动态权限,可以在运行时更改(例如管理员可以直接在应用程序中编辑单个角色的权限),则需要一个“USER_PERMISSIONS”表,并将每个应用程序功能与某些权限而不是角色绑定在一起。 - krokodilko
1个回答

106
如krokodilko在他的评论中所写,这取决于您需要的灵活性水平。
我已经为我的一个客户实现了基于角色的权限,具体如下:
  1. 用户(用户ID(PK),用户名(唯一),密码(加盐和哈希!),名字,姓氏,电话等)
  2. 角色(角色ID(PK),角色名称(唯一),角色描述)
  3. 权限(权限ID(PK),权限名称(唯一))-标签/屏幕/操作在此处
  4. 用户到角色(用户ID,角色ID)- PK是两列组合
  5. 角色到权限(角色ID,权限ID)- PK是两列组合
但我的要求是尽可能灵活,并且它是一个仍在增长中的系统(已有6年)。我想很多应用程序可以将用户与角色作为一对多关系,而不是像我这样使用多对多,但我不会在任何应用程序中硬编码权限或角色到权限。 更多解释请参见:《基于角色的安全数据库设计》来自 What the # do I know?

2
你能多讲一些关于4和5的内容吗? - tomrlh
2
它们只是许多对许多的桥接表,没有太多可以说的... - Zohar Peled
1
我理解的是; 角色将会是(管理员,账户等), 权限将是角色想要访问的视图。我不理解的是剩下的部分。我该如何使用用户到角色和角色到权限的表格? - Stephen Ngethe
3
@vikrant 实际上,Permission 可能不是这个表格的最佳名称。一个更合适的名称应该是 securables - 意思是只有经过授权才能访问的东西 - 这个表格应该包含每个可安全访问的应用程序范围(或域范围)唯一密钥 - 无论是路径、Windows 窗体,甚至是按钮。虽然灵活,但这仍然是一个简单的授权示例 - 意味着授权本身是二进制的 - 它存在或不存在。不同的实现可能包含不同的授权级别 - 类似于“读取/写入/执行”等等。 - Zohar Peled
2
@ZoharPeled非常感谢您与我们分享这个设计:),我使用这些值来进行3)操作: post.read post.create post.comment.write post.all post.none, all用于超级管理员角色,none用于禁止用户,应用程序中的每个操作都在3)中具有权限条目。 - SdSaati
显示剩余14条评论

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