如何将.net成员资格角色分配给各个数据库记录

时间:2010-03-26 17:37:59

标签: asp.net asp.net-membership

我正在开发一个系统,我们希望根据用户的角色限制向用户显示的信息的可用性。

e.g。我有一个名为EventType (ID, EventTypeDescription)的桌子 其中包含以下记录:

1, 'Basic Event'
2, 'Intermediate Event'
3, 'Admin Event'

我需要实现的是根据登录用户的用户名(以及角色)过滤返回的记录。例如,如果高级用户登录,他们将看到所有事件类型,如果标准用户登录,他们将只看到基本事件类型等。

理想情况下,id喜欢这样做,可以根据需要轻松扩展到其他表。因此,我想避免在每个表中添加“角色”字段,其中数据是用户上下文敏感的。

我想到的一个想法是创建某种权限表,如:

PermissionsTable
(
  ID,
  Aspnet_RoleId,
  TableName,
  PrimaryKeyValue
)

这有使用它的缺点显然是必须使用表名来切换要连接的表。

修改: 在没有任何更好的建议的情况下,我将采用我提到的最后一个想法,但是我没有使用TableName字段,而是将TableName规范化为它自己的表,如下所示:

TableNames
(
  ID,
  TableName
)

UserPermissionsTable
(
  ID,
  Aspnet_UserId,
  TableID,
  PrimaryKeyValue
)

4 个答案:

答案 0 :(得分:1)

我们做类似的事情,我们的解决方案是使用表值函数来加入。 即

从事件中选择* 内部联接[dbo] .fn_AvailableEvents(@User_ID)a on e.id = a.id

该函数仅返回允许用户查看的事件的事件ID。

答案 1 :(得分:1)

我在建立CMS时做了类似的事情......

基本上我在db中创建了几个表: 用户 角色 UsersInRoles 对象 ObjectPermissions

好的,它有点像......

前3个是非常自我解释,用户,角色以及它们之间的联系。 根据用户对角色的成员资格授予用户权限。

我接下来要做的是定义我想要控制权限的“对象”和我想要分配它们的权限级别......

所以对象包含对象定义的列表,然后在对象id相关的其他表中扩展,ObjectPermissions表基本上将对象链接到角色。

现在,在这一点上可能值得解释一些关于角色的事情......

我看到一个角色是一个权限列表,仅此而已。

因此,如果我创建一个名为guest的角色并将角色设置为允许读取权限,那么创建一个名为admin的角色,该角色具有全局权限,可以执行所有操作,然后执行此类操作...

添加用户1管理员角色。 将对象1添加到管理员角色。

用户1现在可以完全访问对象1,这里重要的是继承权限,因此任何子对象(想想文件和文件夹权限)也会在同一个角色集中,除非递归覆盖。

所以默认情况下我将根级别对象分配给每个关键系统角色。 然后,我有选择地将用户添加到树中不同点的各种角色。

这有意义吗?

基本上,我可以选择任何对象和任何用户,并通过将用户添加到与对象相同的角色,为该对象及其子对象授予不同程度的权限。

现在有一些值得注意的事情......

如果我希望用户对深层嵌套对象拥有管理员权限但不是根级别,则必须创建一个新角色,授予所有权限并将用户和对象添加到其中。

原因是,如果我将用户添加到主管理员角色,则用户将从根级别获得这些权限而不是来自我的嵌套对象。

除此之外还有更多内容,但实际上这就是文件系统权限的工作方式。

答案 2 :(得分:0)

您没有提到您正在使用的数据库(如果有),但假设使用SQL Server,如果您使用Windows身份验证进行连接,则可以创建基于SYSTEM_USER函数过滤数据的视图或存储过程

答案 3 :(得分:0)

即使你不使用它,这是一种耻辱,你至少可以从Rhino.Security了解这个概念的细节。