【问题标题】:How to assign .net membership roles to individual database records如何将 .net 成员角色分配给各个数据库记录
【发布时间】:2010-03-26 17:37:58
【问题描述】:

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

例如我有一张桌子叫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
)

【问题讨论】:

  • 只是一个想法,但如果您选择 1 个基本选项、2 个中级选项、3 个管理选项,那么您应该在这些数字之间放置一些空格,例如 10 20 30,这样您就可以在其中添加一些额外的代码 -未来之间。这将使您可以按代码对表格进行排序并测试 if (admin) 然后显示 admin-level-or-less。

标签: asp.net asp.net-membership


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    基本上我在数据库中创建了几个表: 用户 角色 用户角色 对象 对象权限

    好的,它可以像这样工作......

    前 3 个非常不言自明,用户、角色以及它们之间的链接。 根据用户的角色成员资格授予用户权限。

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

    所以 objects 包含一个对象定义列表,然后在其他表中扩展这些定义,这些表与对象 id 相关,并且 ObjectPermissions 表基本上将对象链接到角色。

    现在可能值得解释一下有关角色的内容...

    我看到的角色是权限列表,不多也不少。

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

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

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

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

    这有意义吗?

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

    现在有一些事情需要注意......

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 您好,我确实在使用 SQL Server,但很遗憾,我无法使用此解决方案,因为我正在使用表单身份验证。
      • 我不认为表单身份验证和模拟(在连接字符串中使用集成安全性)是相互排斥的。看看visualstudiomagazine.com/articles/2004/05/01/…,它看起来可能对你有用。
      【解决方案4】:

      即使你不使用它,那也太可惜了,你至少可以从Rhino.Security 那里了解这个概念的来龙去脉。

      【讨论】:

        猜你喜欢
        • 2021-11-18
        • 2020-08-16
        • 2019-04-12
        • 2017-02-20
        • 1970-01-01
        • 2021-08-03
        • 1970-01-01
        • 2021-09-01
        • 2019-07-03
        相关资源
        最近更新 更多