首页 文章

组和个人许可设计MVC

提问于
浏览
1

我们目前有一个结构,它为某些用户提供角色,并将其角色与权限相关联,这些权限本质上就是功能 EditUserViewUser

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

新要求是能够让单个用户具有覆盖组权限的权限 . 因此,如果我的用户位于具有 EditUser 的组中,但我们想要删除该特定用户的权限,我们应该可以 . 同样,如果用户位于没有该权限的组中,我们应该能够在需要时提供该访问权限 . 很像Windows文件夹权限 .

如果可能的话,我想在SQL中执行此操作 . 返回他们拥有的所有权限的列表 . 我不确定实现这个的最佳方法 . 我们有 RolesUsers UserRolesPermissionsRolePermissions . 用户通过该链连接到权限 .

我假设我需要创建一个 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

1 回答

  • 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,它没有被个人记录覆盖 .

相关问题