设计帮助:多个用户角色

时间:2012-11-05 19:22:55

标签: php sql authentication permissions

我目前正在设计一个需要使用用户权限和角色的Web应用程序。角色将存储在SQL数据库中(使用MS SQL,但这应该是独立于实现的设计)。

允许用户拥有多个角色的标准做法是什么,如果愿意,可以使用“一对多”关系。

我在概念上提出的是一个int字段的想法,它使用位标志来确定用户是否具有该角色:

User Group | Permission Mask | Value
-------------------------------------
Basic      | 0 0 0 0 1       | 1
Advanced   | 0 0 0 1 0       | 2
...        |    ...          | ...
Admin      | 1 0 0 0 0       | 16

这样,在我的PHP方面的身份验证中,我可以快速计算出用户是否属于该角色。我看到的最大缺点是可读性和理解力。对于没有参与此设计决策的人,他们能够弄清楚维护/升级(新角色)出现时会发生什么吗?

这是否适合我的需要?是否有更标准化的方式允许用户拥有多个角色/组?

2 个答案:

答案 0 :(得分:3)

User
------------
Id
Name


Roles
-----------
Id
Name


UserRoles - the UserID,RoleID combination has to be unique
-----------
UserId,
RoleId


Groups
------------
Id
GroupName


UserGroups - UserID, GroupID combination has to be unique
--------------
UserId
GroupId

样本数据

UserRoles
----------------------------------------------
UserID  | RoleID
--------------------------
123       ADMIN
123       EDITOR
124       SITE-USER

查询

-- if no rows returned, then user does not belong to role
Select 1 From UserRoles Where UserID=123 AND RoleID='ADMIN'

-- get user roles
Select ur.ID, ur.Name From UserRoles ur
JOIN Role r ON ur.RoleID = r.RoleID
JOIN Users u ON ur.UserID = u.UserID
WHERE u.UserID = 123

答案 1 :(得分:1)

你应该做一些简单的事情。这是*-*关系,为什么不在数据库中以这种方式实现呢?您只需要2个表来将这些角色映射到单个用户,您可以轻松添加新角色,这对于潜在的新手来说是有意义的。当然,您最初必须对角色访问功能进行硬编码,但是您可以拥有更简单的升级路径,是否希望整个事情都可以配置。