다음 데이터베이스 구조를 가정 (필요한 경우 수정 가능) ...
페이지와 유효 권한이 포함 된 행을 반환 할 수있는 방식으로 주어진 페이지에서 특정 사용자에 대한 "유효 권한"을 결정하는 좋은 방법을 찾고 있습니다.
이상적인 솔루션에는 CTE를 사용하여 현재 사용자의 주어진 페이지 행에 대한 "유효 권한"을 평가하는 데 필요한 재귀를 수행하는 기능이 포함될 수 있다고 생각합니다.
배경 및 구현 세부 사항
위 스키마는 역할에서 추가 및 제거하여 사용자에게 권한을 부여 할 수있는 컨텐츠 관리 시스템의 시작점을 나타냅니다.
시스템의 리소스 (예 : 페이지)는 해당 역할에 연결된 사용자 그룹에 부여 된 권한을 부여하는 역할과 연결됩니다.
모든 역할을 거부하고 트리의 루트 수준 페이지를 해당 역할에 추가 한 다음 사용자를 해당 역할에 추가하면 사용자를 쉽게 잠글 수 있습니다.
예를 들어 회사에서 근무하는 계약 업체를 장기간 사용할 수없는 경우 권한 구조가 그대로 유지됩니다. 그러면 해당 역할에서 사용자를 간단히 제거하여 원래 권한을 동일하게 부여 할 수 있습니다. .
권한은 이러한 규칙에 따라 파일 시스템에 적용될 수있는 일반적인 ACL 유형 규칙을 기반으로합니다.
CRUD 권한은 널 입력 가능 비트이므로 사용 가능한 값은 true, false이며 다음에 해당하는 경우 정의되지 않습니다.
- 거짓 + 아무것도 = 거짓
- 참 + 정의되지 않음 = 참
- 참 + 참 = 참
- 미정의 + 미정의 = 미정의
권한 중 하나라도 false 인 경우-> false 그렇지 않은 경우 그렇지 않으면-> true 그렇지 않으면 (모두 정의되지 않음)-> false
즉, 역할 멤버 자격을 통해 권한이 부여되고 거부 규칙이 허용 규칙을 재정의하지 않는 한 어떤 권한도 부여되지 않습니다.
이것이 적용되는 권한의 "집합"은 현재 페이지를 포함하여 트리에 적용되는 모든 권한입니다. 즉,이 페이지의 트리에있는 모든 페이지에 false가 적용되면 결과는 false입니다. 그러나 여기까지의 전체 트리가 정의되지 않은 경우 현재 페이지에 실제 규칙이 포함되어 있으면 결과는 여기에 해당하지만 상위에 대해서는 false입니다.
가능한 경우 db 구조를 느슨하게 유지하고 싶습니다. 여기서 나의 목표는 다음과 같은 작업을 수행하는 것입니다. select * from pages where effective permissions (read = true) and user = ?
따라서 어떤 솔루션이든 효과적인 권한으로 쿼리 가능한 세트를 가질 수 있어야합니다. 어떤 식 으로든 (기준을 지정할 수있는 한 반환하는 것은 선택 사항입니다).
1이 다른 사용자의 자식이고 2 개의 역할이 존재하고 (관리자 역할과 읽기 전용 사용자를위한 역할) 2 개의 페이지가 존재한다고 가정하면 둘 다 예상 출력으로 다음과 같은 내용이 표시 될 것으로 예상되는 루트 수준 페이지에만 연결됩니다.
Admin user:
Id, Parent, Name, Create, Read, Update, Delete
1, null, Root, True , True, True , True
2, 1, Child,True , True, True , True
Read only user:
Id, Parent, Name, Create, Read, Update, Delete
1, null, Root, False , True, False , False
2, 1, Child,False , True, False , False
이 질문에 대한 추가 토론은 여기에서 시작 하는 기본 사이트 대화방에서 찾을 수 있습니다 .