我们目前有一个结构,可以为某些用户提供角色,并将其角色与权限相关联,这些权限基本上都是功能。 EditUser
,ViewUser
等
当用户登录时,它会将所有权限加载到auth cookie中,我们的自定义Authorize属性会检查他们是否具有访问该功能所需的权限。这非常有效。
新要求是能够让单个用户拥有覆盖组权限的权限。因此,如果我的用户位于具有EditUser
的群组中,但我们想要删除该特定用户的权限,我们应该可以。同样,如果用户位于没有该权限的组中,我们应该能够在需要时提供该访问权限。很像Windows文件夹权限。
如果可能,我想在SQL中执行此操作。返回他们拥有的所有权限的列表。我不确定实现这个的最佳方法。我们有Roles
,Users
UserRoles
,Permissions
和RolePermissions
。用户通过该链连接到权限。
我假设我需要创建一个UserPermission
表,但我不确定如何编写查询以使该表中的行覆盖RolePermission
表中的行。
非常感谢任何设计原则或方向。如果有必要,我愿意完全连根拔起。
编辑:这是我当前的查询
SELECT PermissionID, PermissionKey
FROM Permission p
INNER JOIN RolePermission rp ON rp.PermissionID = p.PermissionID
INNER JOIN UserRole ur ON ur.RoleID = rp.RoleID
INNER JOIN Users u ON u.UserID = ur.UserID
WHERE u.Username = @Username
答案 0 :(得分:1)
我不确定这是否是实现这些结果的最佳方法,但这个查询基本上得到了我之后的信息。
SELECT p.PermissionKey, 1 AS HasPermission
FROM Permission p
INNER JOIN RolePermission rp ON rp.PermissionID = p.PermissionID
INNER JOIN UserRole ur ON ur.RoleID = rp.RoleID
INNER JOIN Users u ON u.UserID = ur.UserID
WHERE u.Username = @Username AND p.PermissionID NOT IN (
SELECT PermissionID
FROM dbo.Permission
INNER JOIN dbo.UserPermission urp ON urp.PermissionID = p.PermissionID
INNER JOIN Users u ON u.UserID = urp.UserID
WHERE u.Username = @Username)
UNION ALL
SELECT p.PermissionKey, urp.HasPermission
FROM Permission p
INNER JOIN dbo.UserPermission urp ON urp.PermissionID = p.PermissionID
INNER JOIN Users u ON u.UserID = urp.UserID
WHERE u.Username = @Username
这为我提供了用户角色的所有权限记录,并删除了该用户具有UserPermission集的所有记录。这样我只看到RolePermissions它没有被个人记录覆盖。