用用户和组建立数据库的基本模型是什么?


9

我正在尝试为网站的基本安全系统找到最佳方法。我知道我想要用户和组。

我以为我有:

user_table
user_id
user_name
...

group_type
group_id
group_name
parent_id
...

group_table
id
user_id
group_id

第一个是用户,第二个是组,第三个是连接两者的中介表。一个用户有多个组。

听起来还好吗?


除了名字。您的GROUP_TYPE表应该被命名GROUP或类似的名称,并且您GROUP_TABLE应该同时引用用户和组,因为这就是它的链接。
亚当·穆奇

@adam不使用user_id和group_id来执行group_table吗?
约翰尼2012年

4
@AdamMusch不应将其命名为GROUP,因为这是保留字。不得以保留字来命名表和列
Phil12 2012年

1
@菲尔同意了。您也可以命名一个表SELECT和一个字段,FROM以便可以进行类似SELECT [FROM] FROM [SELECT]
JNK 2012年

2
尝试调用诸如“ app_user”和“ app_role”之类的基本实体
ConcernedOfTunbridgeWells

Answers:


17

对此建模的传统方法是使用称为基于角色的安全性的模式。

这个想法不仅是拥有用户组,而且还有权限组。模式如下所示:

基于角色的安全ERD

请注意,您要避免为表名保留字,因此请不要完全按照图中所示命名表。

它的工作方式是,您的组或角色不仅具有分配给他们的用户列表,而且还具有分配给他们的权限列表。如果您跟随我,这将使您既能表彰谁能做什么,又能做什么。


但是,如果我的用户具有管理员等角色,并且由于某种原因同一用户也需要一个特定的权限(该角色既不是该角色,也不是其他任何角色),该怎么办?
levi 2015年

@levi-如果发生这种情况,那么处理该问题的一种方法是扮演一个特殊角色,例如“ Bob's Special Permissions”,这有点麻烦,但是只要您没有太多例外,它就可以解决问题。这个。您认为的个别例外实际上可能是您未曾考虑过的微妙的新角色。鲍勃退出时会发生什么?鲍勃的继任者是否也需要获得特别许可?如果是这样,那么您实际上只有一个成员,而不是例外。
乔尔·布朗

@levi-另一种可能性是,您确实需要混合使用个人权利和角色权利。在这种情况下,您的ROLE表可以被子类型化为“ 个人”和“ 组”类型,其中“组”类型具有零到许多成员,而“个人”类型恰好具有一个成员。如何执行这些基数规则取决于您。可以在您的数据库模式中声明性地完成此操作,在这种情况下,您需要稍微更改图中所示的模式。或者,您可以使用应用程序逻辑,在这种情况下,您的架构仍然像我上面所描绘的那样。
乔尔·布朗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.