2013-12-16 2 views
0

SQL 데이터베이스를 저장소로 사용하는 웹 응용 프로그램에 대해 ACL 기반 권한 부여 시스템을 만들고 싶습니다.ACL을 플랫 식으로 변환

내 문제는 - 검색을 필터링하기 위해 ACL로 정의 된 인증 규칙을 사용하고 싶습니다. 이를 위해 ACL을 WHERE 절에서 사용할 수있는 평범한 부울 표현식으로 변환해야합니다.

내 ACL 시스템은 간단합니다. 모든 항목은 허용 또는 거부 중 하나이며 조건을 추가합니다. 목록은 위에서 아래로 스캔됩니다. 조건과 일치하는 첫 번째 항목이 적용됩니다. 그래서 예. 내가 같은 ACL이있는 경우 :

ALLOW x = 3 
ALLOW x = 5 
DENY true 

을 내가 함께 필터링해야합니다 x = 3 OR x = 5

내가있는 경우 :

DENY x = 3 
DENY x = 5 
ALLOW true 

필터가 될 것입니다 NOT (x = 3 OR x = 5)

내가 그러나 나는 아직도 어떤 순서로든 DENY 및 ALLOW 규칙을 혼합하여 적용 할 수있는 보편적 인 변환 방법을 만드는 방법을 모릅니다. 그러나 이 true로 평가되는 규칙이되어야한다고 가정 할 수 있습니다. ACL 상속을 통해 모든 목록의 끝에 DENY true을 넣을 수 있습니다.

이 수수께끼를 풀어 주시겠습니까?

답변

0

나는 이미이 문제를 해결했다. 이전에 문제였던 3 가치 논리를 피하기위한 열쇠는 목록의 끝에서 시작하는 것입니다. 이 알고리즘은 다음과 같이 표시됩니다

예를 들어 그래서
group the acl into packs of ALLOW and DENY 
discard the last pack (which should be DENY and end with DENY true) 
add 'false' to the result 
for every pack from the end: 
    combine all the conditions with OR 
    if pack is ALLOW: 
     add "or condition" to the result 
    elif pack is DENY: 
     add "and not condition" to the result 
if result == 'false': 
    don't perform search, return empty list 
else: 
    discard 'false or' from the beginning of the list (redundant) 

:

DENY x = 7 
ALLOW x > 3 
DENY true 

이 될 것 false OR x > 3 AND NOT (x = 7)