3

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

  UserId        permission
 11100001        ViewThis
 11100001        ViewThat
 11100002        EditThis
 11100003        EditThat

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

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

4

3 回答 3

2

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

在此处输入图像描述

我猜,表格很User清楚。PermissionAccessible您存储要限制访问的内容:CostCenter, ContractType, ...

根据您的描述,我了解到您想要定义 Accessibles 和 Permissions 的特定组合(CostCenter上的ViewThisContractType上的ViewThat等)。因此,您可以在 中定义这些组合AccessiblePermission

获得这些组合后,您可以将它们分配给UserAccessiblePermission.

这是授权的定义部分。

授权的实施部分应包括业务逻辑,该业务逻辑授予用户没有特定权限的所有可访问性的所有权限。当有特定权限时,权限变为无,除了

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

于 2013-09-24T20:55:52.227 回答
0

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

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

于 2013-09-24T19:48:14.730 回答
0

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

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 |
| .. | ....... | ....... |
+----+---------+---------+

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

于 2013-09-24T21:38:45.017 回答