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增强界面使其管理起来相当容易。祝你好运