【问题标题】:Storing different user permissions in databse with customizations使用自定义在数据库中存储不同的用户权限
【发布时间】:2013-09-24 18:33:54
【问题描述】:

在自定义用户权限中,我们有类似的东西:

  UserId        permission
 11100001        ViewThis
 11100001        ViewThat
 11100002        EditThis
 11100003        EditThat

现在,我们希望ViewThis 更加个性化,例如针对特定成本中心,因此某个用户只能查看来自某个成本中心的员工。所以我添加了一个专栏CostCenter。如果是NULL,则表示用户可以查看所有成本中心。现在的问题是一些其他权限,例如ViewThat 也需要自定义,问题是自定义或限制不针对某个成本中心,它确实针对其他因素,例如合同类型。因此,具有ViewThat 权限的用户应仅限于具有特定合同类型的员工。所以我添加了另一列ContractTypeID。在不需要此字段的权限中应忽略此列。有时,某个权限需要两个或多个自定义/限制字段。

现在的问题是,每当我需要向权限添加自定义/限制时,表格就会水平增长。有没有更好的方法或最佳实践来处理这种困境?

【问题讨论】:

    标签: c# entity-framework database-design permissions


    【解决方案1】:

    有一种方法可以在数据模型中对此进行规范化。让我给你举个例子:

    我猜UserPermission 的表很清楚。在Accessible 中存储您想要限制访问的内容:CostCenterContractType、...

    根据您的描述,我了解到您想要定义可访问性和权限的特定组合(CostCenter 上的ViewThis 上的 ViewThat ContractType 等)。所以你可以在AccessiblePermission中定义这些组合。

    获得这些组合后,您可以将它们分配给UserAccessiblePermission 中的用户。

    这是授权的定义部分。

    授权的强制执行部分应包含对所有授予所有权限的业务逻辑> 用户没有特定权限的可访问性。当有特定权限时,授权变为无,除了

    这只是解决此问题的一种方法。如果它 100% 符合您的所有要求,我会感到惊讶,但我希望它能给您一些指导。

    【讨论】:

      【解决方案2】:

      关系数据库实际上可能不是您的最佳选择。您的数据听起来非常非结构化,这更适合您仅存储键/值对的 xml 或 NoSQL 数据库。通常,您可以存储用户、角色和 users_to_role 表,其中角色表仅包含您随后签入代码的角色名称。

      如果您被关系数据库困扰,您可以为每个角色创建一个表。每个表都会引用一个用户及其授予的权限。所以一个 ViewThis 表有一个用户 id 和一个 CostCenter。这将使添加新权限变得更加困难,因为您必须创建一个新表,但您必须一直添加列。这只是隔离每个权限并使其更加集中在表格中。

      【讨论】:

        【解决方案3】:

        这是我管理用户权限的典型设置。它看起来很像你的,除了我让我的权限和角色更细化......

        actions
            id              varchar(50)
            description     varchar(200)
        
        +---------------+--------------------------------------------------------+
        |    id         | description                                            |
        +---------------+--------------------------------------------------------+
        | VIEW_CC1_ACCT | Allow users to view Cost Center 1 accounting employees |
        | VIEW_CC1_HR   | Allow users to view Cost Center 1 HR employees         |
        | VIEW_CC1_IT   | Allow users to view Cost Center 1 IT employees         |
        | VIEW_CC2      | Allow users to view Cost Center 2 employees            |
        | ............. | ...................................................... |
        +---------------+--------------------------------------------------------+
        
        roles
            id              unsigned int(P)
            description     varchar(50)
        
        +----+--------------------------------+
        | id | description                    |
        +----+--------------------------------+
        |  1 | Cost Center 1 Accounting Clerk |
        |  2 | Cost Center 1 HR Manager       |
        |  3 | Director of HR                 |
        | .. | .............................. |
        +----+--------------------------------+
        
        roles_actions
            id              unsigned int(P)
            role_id         unsigned int(F roles.id)
            action_id       varchar(50)(F actions.id)
        
        +----+---------+---------------+
        | id | role_id | action_id     |
        +----+---------+---------------+
        |  1 |       1 | VIEW_CC1_ACCT |
        |  2 |       2 | VIEW_CC1_HR   |
        |  3 |       3 | VIEW_CC1_ACCT |
        |  4 |       3 | VIEW_CC1_HR   |
        |  5 |       3 | VIEW_CC1_IT   |
        |  6 |       3 | VIEW_CC2      |
        +----+---------+---------------+
        
        users
            id              unsigned int(P)
            username        varchar(32)(U)
            password        varchar(123) // Hashed, like my potatoes
            ...
        
        +----+----------+----------+-----+
        | id | username | password | ... |
        +----+----------+----------+-----+
        |  1 | bob      | ******** | ... |
        |  2 | april    | ******** | ... |
        |  3 | grant    | ******** | ... |
        | .. | ........ | ........ | ... |
        +----+----------+----------+-----+
        
        users_roles
            id              unsigned int(P)
            user_id         unsigned int(F users.id)
            role_id         unsigned int(F roles.id)
        
        +----+---------+---------+
        | id | user_id | role_id |
        +----+---------+---------+
        |  1 |       1 |       1 |
        |  2 |       2 |       2 |
        |  3 |       3 |       3 |
        | .. | ....... | ....... |
        +----+---------+---------+
        

        您有什么理由不能采用这种方法吗?我只展示了成本中心的示例,但对于合同类型或您需要添加的任何其他限制,它的工作方式相同 - 只需创建适当的 actionsrolesroles_actions,然后将受影响的 users 重新分配给新的roles

        【讨论】:

        • 这对于拥有 30 或 40 个不同 CC 以及 30 或 40 种不同类型权限的公司来说会很困难。我最终将获得 (40x40) 不同类型的权限。
        • @HaLaBi - 我同意 900-1600 可能的 actions 需要管理很多,但肯定不是每个排列都必须创建?如果需要所有可能的排列,您提出的任何解决方案都必须解决所有 900-1600 种可能性。到那时,问题就变成了“为每个用户管理 900-1600 个二进制标志的最简单方法是什么?”我认为我最需要管理的是大约 450 个选项。 actions 的仔细命名和方便的 jQuery 增强界面使它相当容易管理。祝你好运!
        猜你喜欢
        • 2016-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-02
        • 2017-01-27
        • 2012-05-05
        • 2021-11-21
        • 2021-07-08
        相关资源
        最近更新 更多