群组和个人权限设计MVC



我们目前有一个结构,它赋予某些用户角色,并将他们的角色与权限相关联,这些基本上都是功能。EditUserViewUser

当用户登录时,它会将他们的所有权限加载到authcookie中,我们的自定义Authorize属性会检查他们是否具有访问该函数所需的权限。这很管用。

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

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

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

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

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。

最新更新