组和个人权限设计MVC

Group and Personal Permission Design MVC

我们目前有一个结构,可以赋予特定用户角色并将他们的角色与权限相关联,这本质上是功能。 EditUserViewUser

当用户登录时,它会将他们的所有权限加载到 auth cookie 中,并且我们的自定义 Authorize 属性会检查他们是否具有访问该功能所需的权限。这很好用。

新要求是能够让单个用户拥有覆盖组权限的权限。因此,如果我的用户在具有 EditUser 的组中,但我们想为该特定用户删除该权限,我们应该能够。同样,如果用户所在的组没有该权限,我们应该能够在需要时授予该权限。很像 Windows 文件夹权限。

如果可能,我想在 SQL 中完成此操作。 Return 他们拥有的所有权限的列表。我不确定实现这个的最佳方法。我们有 RolesUsersUserRolesPermissionsRolePermissions。用户通过该链连接到权限。

我假设我需要创建一个 UserPermission table,但我不确定我将如何编写查询以使 table 中的行覆盖来自RolePermission table。

非常感谢任何设计原则或方向。如有必要,我愿意完全连根拔起。

编辑:这是我当前的查询

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

我不确定这是否是获得这些结果的最佳方式,但这个查询基本上得到了我想要的。

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。