我正在开发一个系统,我们希望根据用户的角色限制向用户显示的信息的可用性。
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
)
答案 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了解这个概念的细节。