2010-03-24 4 views
1

그룹/사용자 기반 보안 시스템을 설정하고 있습니다. ACL은 ITEM_ID와 하나 그룹 또는 사이의 매핑그룹/사용자 기반 보안. 테이블/SQL 질문

  • 사용자
  • 그룹
  • group_user_mappings
  • ACL

다음과 같이

나는 4 개 테이블이 사용자.

나는 ACL 테이블을했던 방법, 나는 노트의 3 열이 (자동 ID로 실제로 4 일을하지만 무관)

  • COL 1 ITEM_ID (액세스 항목)
  • COL 3 (액세스 할 수있는 사용자) USER_ID (액세스 할 수있는 기)
  • COL 3 GROUP_ID 예 그래서

항목 1, 피터,

항목 2, 그룹 1

항목 3, 제인,

때문에 어느 ACL이 사용자 또는 그룹에 대한 액세스를 제공한다. ACL 테이블의 한 행에는 항목 -> 사용자 맵핑 또는 항목 그룹이 있습니다. 나는에 사용자가 액세스 할 수있는 모든 개체를 반환하는 쿼리를 원한다면

, 나는 내가 좋아하는 가입이 별도의 쿼리 ..

항목을 필요로하기 때문에 나는 노동 조합이있는 SQL 쿼리를 가질 필요가 있다고 생각 -> acl -> 그룹 -> 사용자 AND 항목 -> acl -> 사용자

괜찮을 것 같습니다. 이것이 정상적으로 수행 된 방법입니까? 이 일을 올바르게하고 있습니까?

조금 지저분 해 보입니다. 나는 각 개인에 대해 단일 사용자 그룹을 만들어 주위를 돌아 다닐 수 있다고 생각했기 때문에 SQL에서 그룹을 다룰뿐입니다. 그러나 이것은 조금 혼란 스럽습니다.

+0

비슷한 설정이 있지만 사용자에게 역할, 그룹 및 사용자를 할당 한 다음 그룹에 할당 할 수 없습니다. 그룹에 단 한 명의 사용자가있는 것으로 밝혀지면 그렇습니다. 그러나 모든 것을 관리하기가 더 쉽습니다. 그리고 현실적으로 몇 명의 그룹 만 하나의 사용자로 가질 수 있습니까? 또한 사용자가 직접 권한을 할당받은 사용자가 그룹을 통해 직접 액세스하지 못하게하는 것도 설계 상으로는 없습니다. 그러면 역할이 쿼리에서 두 번 발생합니다. 또한 권한을 취소하려는 경우 그룹 액세스뿐만 아니라 직접 액세스를 확인하는 것을 기억해야합니다. – Tony

+0

고마워, 나는 그것이 모두 너무 어려워지면 나는이 길로 갈 것이라고 느꼈다. – Brett

답변

1

2 개의 별도로 필요하지 않습니다. 검색어 자체 :

select 
    * /* correct to columns needed */ 
from 
    users u 
     left join 
    group_user_mappings g 
     on 
      u.user_id = g.user_id 
     inner join 
    acl 
     on 
      (acl.user_id = u.user_id or 
      acl.group_id = g.group_id) 
/* TODO - Add more tables, where clause, etc */ 
+0

멋지다. 8-) 깔끔하고 지저분한 해결책인가? user_acl, group_acl 및 union에 대한 두 개의 별도 테이블이 있어야합니까? 아니면이 방법이 좋을까요? – Brett