Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用自定义项在数据库中存储不同的用户权限_C#_Entity Framework_Database Design_Permissions - Fatal编程技术网

C# 使用自定义项在数据库中存储不同的用户权限

C# 使用自定义项在数据库中存储不同的用户权限,c#,entity-framework,database-design,permissions,C#,Entity Framework,Database Design,Permissions,在自定义用户权限中,我们有如下内容: UserId permission 11100001 ViewThis 11100001 ViewThat 11100002 EditThis 11100003 EditThat 现在,我们希望ViewThis更加定制,例如针对特定的成本中心,因此某个用户只能查看某个成本中心的员工。因此,我添加了一列CostCenter。如果NULL,则表示用户可以查看所有成本中心。现在的问

在自定义用户权限中,我们有如下内容:

  UserId        permission
 11100001        ViewThis
 11100001        ViewThat
 11100002        EditThis
 11100003        EditThat
现在,我们希望
ViewThis
更加定制,例如针对特定的成本中心,因此某个用户只能查看某个成本中心的员工。因此,我添加了一列
CostCenter
。如果
NULL
,则表示用户可以查看所有成本中心。现在的问题是一些其他权限,例如,视图,也需要自定义,问题是自定义或限制并不针对某个成本中心,而是针对其他因素,例如合同类型。因此,具有查看权限的用户认为应限于具有特定合同类型的员工。因此,我添加了另一列
ContractTypeID
。在不需要此字段的权限中,应忽略此列。有时,某个权限需要两个或多个自定义/限制字段


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

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


如果您一直使用关系数据库,那么可以为每个角色创建一个表。每个表都将引用一个用户及其授予的权限。因此,视图将显示此具有用户id和成本中心的表。这将使添加新权限变得更加困难,因为您必须创建一个新表,但您必须一直添加列。这只是隔离了每个权限,并使其在表中更加集中

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

我想,
User
Permission
表是很清楚的。在
Accessible
中存储要限制访问的内容:
CostCenter
ContractType

根据您的描述,我理解您希望定义可访问性和权限的特定组合(在CostCenter上查看此项,在ContractType上查看此项,等等)。因此,您可以在
AccessiblePermission
中定义这些组合

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

这是授权的定义部分

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


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

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

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

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

对于一个拥有30或40个不同CCs的公司来说,这将是困难的。。。以及30或40种不同类型的权限。我将得到(40x40)种不同类型的权限。@HaLaBi-我同意900-1600种可能的
操作需要管理很多,但肯定不是每一种排列都需要创建吗?如果需要每一种可能的排列方式,你提出的任何解决方案都必须解决所有900-1600种可能性。在这一点上,问题变成了“为每个用户管理900-1600个二进制标志的最简单方法是什么?”我认为我最需要管理的是大约450个选项。仔细命名
操作
和一个方便的jQuery增强界面使其管理起来相当容易。祝你好运