2011-05-03 3 views
2

Zend_ACL을 예로 들어 보니이 프로젝트를 어떻게 구성해야하는지 궁금합니다. 물론 예제가 모두 좋고 깔끔하지만 실제 사이트는 훨씬 더 복잡합니다.ACL을 구성하고 관리하는 방법은 무엇입니까?

$acl = new Zend_Acl(); 

$acl->addRole(new Zend_Acl_Role('guest')); 
$acl->addRole(new Zend_Acl_Role('member')); 
$acl->addRole(new Zend_Acl_Role('admin')); 

$parents = array('guest', 'member', 'admin'); 

$acl->addRole(new Zend_Acl_Role('someUser'), $parents); 

$acl->add(new Zend_Acl_Resource('someResource')); 
$acl->deny('guest', 'someResource'); 
$acl->allow('member', 'someResource'); 

echo ($acl->isAllowed('guest', 'someResource') ? 'allowed' : 'denied'); 

내 사이트의 각 컨트롤러/페이지에 어떤 종류의 액세스 검사가있을 경우 전 세계적으로 사용할 수있는 규칙이 필요합니다. 이것은로드시 모든 규칙을 설정하기 위해 방대한 설정 파일이나 클래스를 생성해야한다는 것을 의미합니까? 그게 많은 기억을 낭비하지 않을까요?

그러나 ACL의 목적을 무효로 할 각 컨트롤러에 필요한 규칙 만 설정하면 어떻게됩니까? ACL을 사용하는 주된 이유는 다음과 같이 코드베이스 전체에 권한이 분산되는 것을 피하기 위해서입니다.

Admin_Controller 
{ 
    public function action() 
    { 
     if($user->role !== 'admin') 
     { 
      die('not allowed'); 
     } 
    } 
} 

변경 사항은 어떻게됩니까? ACL 규칙이 관리자가 쉽게 권한을 변경할 수있는 데이터베이스에 저장되는 경우 어떻게됩니까? 각 페이지 요청을 모두 다운로드해야합니까? 시스템에 큰 부담을 안겨 주겠습니까?

즉, ACL은 대형 사이트에서 어떻게 작동합니까? 어떤 문제가 발생합니까? 계단식 사용 권한은 어떻게 처리됩니까?

답변

1

새 역할이 추가되거나 변경 될 때 db를 쿼리하면되므로 memcache를 사용하여 데이터베이스에 역할을 저장하고 메모리에 캐시 할 수 있습니다. ACL을 구현하는 한, 전체 시스템에서 사용되기 때문에 Bootstrap.php 파일에서 ACL을 초기화 한 다음 Zend_Registry에 객체를 저장하여 전체 앱에서 액세스 할 수 있도록 할 수 있습니다.

이러한 규칙을 적용하는 것은 여러 가지 시점에서 발생할 수 있습니다. 사용자 지정 라우터 또는 컨트롤러 수준에서 상위 수준의 경로를 적용 할 수 있습니다. Zend_Controller_Action을 확장하면 다른 모든 컨트롤러가 파생 된이 마스터 컨트롤러에 ACL 규칙을 넣을 수 있습니다. _init() 메소드에서 ACL 권한을 점검 할 수 있습니다. ACL을 필요로하는 시스템의 다른 지점 (ACL을 레지스트리에 저장하는 이유)은 ACL을 작성하는 방법과 방법에 따라이를 확인하려는 것입니다.

관련 문제