2011-09-23 2 views
0

이전에이 주제를 훑어 보았지만 아직 깔끔한 해결책을 찾지 못했습니다.동적 사용 권한 제약 조건을 코드화하고 저장하는 방법은 무엇입니까?

고객이 웹 사이트를 사용하여 코스를 예약 할 수있는 응용 프로그램이 있고 관리자 직원도 백엔드 시스템을 사용하여 고객을 대신하여 코스를 예약 할 수 있다고 가정 해보십시오. 권한이 부울이 아니며 응용 프로그램에 하드 코딩되어서는 안되기 때문에 HR 관리자가 can_make_booking과 같은 사용 권한에 적용한 제약을 코드화 할 수있는 방법을 마련하려고합니다.

현재 고객은 코스 날짜가 적어도 표준 알림 일 'n'일 이후에 예약 할 수 있으며 이용 가능한 장소의 수를 초과하여 예약하지 않고 지불하고 있습니다. 만기 금액 (또는 계좌가 송장으로 설정된 경우에는 nil). 관리자는 예약 날짜가 지금부터 언제든지 백엔드 애플리케이션을 사용하여 예약 할 수 있습니다.

나는 이와 비슷한 것을 상상한다.

role  permission constraint 
-------- ------------ ---------- 
customer make_booking 1 
customer make_booking 2 
customer make_booking 3 
manager make_booking 5 

그런 제약의 테이블, 다음 eval 에드 코드 같은 것을 만들 것이다 고객 역할에 대한 이러한 제약을 체인으로 연결

constraint property  operator value      OR_parent 
---------- ------------ -------- -------------------------- --------- 
1   $course_date >=  strtotime("+$notice days") NULL 
2   $places_booked <=  $places_available   NULL 
3   $paid   >=  $total      NULL 
4   $send_invoice ==  TRUE      3 
5   $course_date >=  strtotime("now")   NULL 

(제약 # 4 : HR 관리자는 다음과 같이 권한 제약 조건을 추가 할 수

if($course_date >= strtotime("+$notice days") && $places_booked <= $places_available && ($paid >= $total || $send_invoice == TRUE)){ 
    // make the booking 
} 

각 규칙은 JavaScr 같이, 각각의 단계에서 개별적으로 사용될 수있다 :는 OR 서열의 일부)로서 # 3 짝 ipt 및 양식 유효성 확인을 통해 예약을 할 수없는 경우 피드백을 제공합니다.

그러나 고객이 한 번에 3 곳만 예약 할 수 있도록 고객이 규칙을 변경하고 $paid 금액은 적어도 $deposit 금액이어야합니다. 이상적으로, 나는 그들이 PHP 코드에 대한 액세스를 제공하지 않고 이러한 PHP 규칙을 동적으로 빌드 할 수있게하고 싶습니다. 속성과 값은 eval 코드가 문제가되지 않도록 위생 처리 될 수 있습니다. 어떤 경우에는 각 규칙의 모든 조합을 하드 코딩하지 않으려 고합니다. HR 관리자의 논리를 미리 추측 할 수있는 명확한 방법이 없을 것입니다.

저는 Zend_ACL 버전 assertions을 보았습니다. 그러나 나는 그들이 찾고있는 역 동성을 제공하지 않는 것 같습니다. 이러한 동적 제약 조건을 구현하는 좋은 방법은 무엇입니까? 다른 환경에서 온 생각들? 감사!


데이빗 쇼에 의한 CUSEC 프리젠 테이션에서이 문제 "ACL이 죽었다"왜 얘기에 좀 더 통찰력 - http://vimeo.com/2723800

답변

1

음이 여전히 오히려 큰 거래를 이끌어 분야 중 하나입니다 토론의 어떤 사람들은 [누가? - 다른 사람들 사이에 Atwood라고 생각하지만, 링크가 나를 도망칩니다. 모든 것을 할 수있는 응용 프로그램이 이미 만들어졌습니다. 그것은 C라고 불립니다. 비즈니스 규칙이 변경 될 때마다 프로그래머가 필요하지 않음을 알 수 있지만, 너무 일반적으로 너무 일반적인 영역을 경계로하고 싶습니다.

그런 시스템을 구현해야한다면 도메인으로 분해하려고 할 것입니다. 두 번째 테이블에서 이미 비교적 잘 수행했습니다. 비즈니스 규칙을 복합화하는 데 사용되는 별도의 도메인으로 표준화하면됩니다. 함께 또는 1 개의 많은 제약으로 구성되는 비즈니스 규칙을 생성합니다. 각 제약 조건에는 용어에 대해 연산자로 제한되는 속성이 필요합니다.용어는 속성에서 함수에 이르기까지 복합 함수가 될 수 있기 때문에 까다로울 수 있습니다. 비즈니스 규칙을 확인하여 필요한 것을 확인하는 것이 가장 쉽습니다. 먼저 'NOW'와 같은 속성, 불리언 및 일상적인 것으로 시작하십시오.

스키마 자체는 예를 들어 constraints이 여러 개 포함 된 rules으로 구성됩니다 (원하는 모든 [사용자 그룹/오퍼/타임 팬/기타 도메인]에 이들을 연결할 수 있다는 명백한 이점이 있습니다). 이것들은 properties으로 구성되며 operators (참조 테이블은 대부분 프로그래머가 아닌 사용자를 위해 사용자 정의 설명 이름을 입력 할 수 있지만 특정 시점에 사용자 정의 함수를 입력 할 수 있습니다) 및 물론 terms 중 하나입니다. 마지막 부분이 가장 복잡한 부분이므로 term_types의 ID로 자격을 부여해야하므로 다른 속성이나 기능과 비교할 수 있습니다. VARCHAR을 입력하고 PHP로 필드를 만들 수도 있습니다. PHP를 사용하여 필드를 생성하는 것은 어렵지 않을 것입니다. 모든 옵션을 가지고있는 방법이 properties 및/또는 functions 인 경우입니다.

매우 개방적인 시스템 (더 좋은 방법이있을 것입니다.) 때문에 비즈니스 규칙에서 높은 수준의 역 동성이 필요하다는 것을 알지 못하는 한 가치가 없을 것입니다.

+0

귀하의 의견에 1을 더한 것은 다른 솔루션을 반영한 것으로 입증되었습니다. 감사 – boatingcow

관련 문제