【问题标题】:Design help: Multiple User Roles设计帮助:多个用户角色
【发布时间】:2012-10-25 16:32:27
【问题描述】:

我目前正在设计一个需要使用用户权限和角色的网络应用程序。角色将存储在 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 端的身份验证中,我可以快速计算出用户是否属于该角色。我看到的最大缺点是可读性和理解性。对于不参与此设计决策的人,他们是否能够弄清楚维护/升级(新角色)出现时发生了什么?

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

【问题讨论】:

    标签: php sql authentication permissions


    【解决方案1】:
    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
    

    【讨论】:

    • 那么,随着 SQL 方面的复杂性增加,从 Web 开发的角​​度来看,我期待什么样的腿部工作?看起来我会做更多的匹配和布尔逻辑来确定角色,还是只需要定义更复杂的查询?
    • 那是规范你的数据库——查询并不复杂
    • @codingbiz 它实际上使您的查询更容易!它们都将是具有这种结构的短衬里。
    • 似乎是共识。我将使用这种方法。感谢您提供详细信息和示例。
    • 这就是我在回答中的意思。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-02-21
      • 2021-06-28
      • 2014-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-28
      • 2017-10-06
      • 1970-01-01
      相关资源
      最近更新 更多