我的 SQL Server 2008 数据库中有一个角色表,其中包含网站内容用户的不同角色(例如管理员、主管、经理、...、基本用户)。使用 LINQ to Entities 我需要根据权限层次结构的高度来检索不同角色的查询结果。
角色不是线性层次结构,Admin 角色是具有最高权限的 root,但也有 Manager 和 Director 等角色,它们不分上下,但对同一数据具有不同的读取/修改权限。数据对双方都是可见的,但一些仅供董事读取的数据可由经理修改,反之亦然。可以添加新角色,它们是 Director 或 Manager 的子角色,并且只能访问其各自数据集的子集和更严格的读取/修改权限。基本用户是最少的角色,并且具有最受限制的数据访问权限,但也是 Director 和 Manager 的子角色(因此这是 DAG 而不是树)。
我正在尝试在数据库中设计一个角色层次结构(最好只有一个新表),它允许使用 LINQ to Entities 的导航属性轻松查询此 DAG 关系的不同分支。所以类似于:
var RoleRestrictedEntities
= Entities.Where(e => e.User.Role.RoleType <= currentUserRole.RoleType);
如有必要,可以适当地替换<=
运算符(我知道我不能在 LINQ to Entities 中进行运算符重载)。请注意,RoleType 实际上是一个具有它自己的字段(例如int Role.RoleType.Level
)的表,而不仅仅是 Role 的整数字段,这很好。
这种角色层次结构的基本目的是区分谁可以修改数据,谁可以将数据视为只读,谁甚至根本看不到数据。更高级别的角色可以查看或可能修改其下属角色的用户所做的一切。他们看不到他们上面的角色处理过的数据。
这需要相当快地实现(表不多),将新角色插入层次结构或删除旧角色不太困难(这些操作很少见,但我不想要调试噩梦),最重要的是容易使用 LINQ to Entities 查询角色及其子角色。关于如何解决这个问题的任何建议?