2017-11-05 9 views
1

현재 특정 사용자에게 역할을 부여하고 기본적으로 기능 인 사용 권한을 역할과 연결하는 구조가 있습니다. EditUser, ViewUser그룹 및 개인 권한 디자인 MVC

사용자가 로그인하면 모든 권한이 인증 쿠키에로드되고 사용자 지정 권한 부여 특성이 기능에 액세스하는 데 필요한 권한이 있는지 확인합니다. 이것은 잘 작동합니다.

새로운 요구 사항은 개별 사용자에게 이 그룹 사용 권한 인을 재정의 할 수있는 권한을 갖도록하는 것입니다. 따라서 내 사용자가 EditUser 인 그룹에 있지만 특정 사용자에 대해 해당 권한을 제거하려는 경우 가능해야합니다. 같은 맥락에서, 사용자가 그 권한이없는 그룹에 있다면 우리는 필요할 경우 그 액세스 권한을 부여 할 수 있어야합니다. Windows 폴더 사용 권한과 비슷합니다.

가능한 경우 SQL에서이 작업을 수행하려고합니다. 보유한 모든 권한 목록을 반환하십시오. 나는 이것을 구현하는 최선의 방법이 확실하지 않다. 우리는 Roles, UsersUserRoles, PermissionsRolePermissions입니다. 사용자는 해당 체인을 통해 권한에 연결됩니다.

나는 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

하지만이 쿼리는 기본적으로 난 후 무엇을 가져옵니다.

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 

이렇게하면 users 역할에 대한 모든 권한 레코드가 제공되고 해당 사용자에게 UserPermission이 설정된 모든 레코드가 제거됩니다. 이 방법으로 개인 레코드에 의해 재정의되지 않은 RolePermissions 만 볼 수 있습니다.