2011-04-20 1 views
0

기본적으로 어설 션에서 false를 반환하면 acl 규칙에서 허용하는 경우에도 액세스가 거부됩니다. 내가하고 싶은 일은 반대로, 즉 acl 규칙이 그것을 거부하면 액세스를 허용하기 위해 어설 션에서 true를 반환합니다. 예를 들어Zend Acl - 어설 션이 acl 규칙이 false를 반환 할 때 권한에 대한 액세스를 허용 할 수 있습니까?

: 나는 ACL 규칙에서 허용되지 않습니다에 대한 요구하고있는 특권, 따라서이 지금까지 주장으로 받고 있지 않기 때문에 isAllowed 위

class TestAssert implements Zend_Acl_Assert_Interface 
{ 
    public function assert(Zend_Acl $acl, Zend_Acl_Role_Interface $role = null, Zend_Acl_Resource_Interface $resource = null, 
          $privilege = null) 
    { 
     return true; 
    } 
} 

$acl = new Zend_Acl; 
$acl->addResource('page'); 
$acl->addRole('user'); 

$acl->allow('user', 'page', 'read', new TestAssert); 
$acl->isAllowed('user', 'page', 'write'); 

()는 false를 돌려줍니다.

내가 원하는 것은 무엇입니까?

내가 원하는 이유는 사용자가 모든 페이지에 대해 특정 권한을 가질 수 있고 자신이 만든 페이지에 대해 다른 권한 집합을 가질 수 있다는 것입니다. 권한을 쿼리 할 때 페이지에 대해 말할 수 있기를 원합니다. 그것들이 맞다면 "페이지"보다는 "자신의 페이지"에 대한 규칙을 적용하십시오. 분명히 실제 앱에서는 문자열 대신 사용자 및 페이지 객체가 전달됩니다.

업데이트 : Zend_Acl을 서브 클래 싱하여 관리하고 있습니다.

이 클래스를 사용하면 특정 역할 및 자원 조합에 대해 콜백을 추가 할 수 있습니다. isAllowed()가 호출되면 콜백이 실행되면 실행됩니다. 어설 션과 동일한 매개 변수로 전달됩니다 (parent :: isAllowed()의 결과도 마찬가지 임). 이 콜백의 반환 값은 null이 아닌 한 isAllowed()에서 반환됩니다.이 경우 정상적인 반환 값이 사용됩니다. 당신은 사용자가 모든 페이지를 읽을 수 있기를 기대 만 쓸 ​​것 여기

class WriteAssert implements Zend_Acl_Assert_Interface 
{ 
    public function assert(Zend_Acl $acl, 
          Zend_Acl_Role_Interface $role = null, 
          Zend_Acl_Resource_Interface $resource = null, 
          $privilege = null) 
    { 
     // return whether the user owns the page 
    } 
} 

$acl = new Zend_Acl; 
$acl->addResource('page'); 
$acl->addRole('user'); 

$acl->allow('user', 'page', 'read'); 
$acl->allow('user', 'page', 'write', new WriteAssert); 
$acl->isAllowed('user', 'page', 'write'); 

:

class Acl extends Zend_Acl 
{ 
    protected $_callbacks = array(); 

    /** 
    * Takes into account the callback to determine whether the role is allowed access 
    * 
    * @param Zend_Acl_Role_Interface $role 
    * @param Zend_Acl_Resource_Interface $resource 
    * @param string $privilege 
    * @return bool 
    */ 
    public function isAllowed($role = null, $resource = null, $privilege = null) 
    { 
     $result = parent::isAllowed($role, $resource, $privilege); 
     $role = $this->getRole($role)->getRoleId(); 
     $resource = $this->get($resource)->getResourceId(); 

     if(isset($this->_callbacks[$role][$resource])) 
     {   
      $callbackResult = call_user_func($this->_callbacks[$role][$resource], $this, $role, $resource, $privilege, $result); 
     } 

     return isset($callbackResult) ? $callbackResult : $result; 
    } 

    /** 
    * Add a callback for a specific role and resource combination. 
    * If the callback returns a value, this is used as the return value for isAllowed(). 
    * Otherwise, if the callback returns null, the normal result of isAllowed() will be used. 
    * 
    * @param Zend_Acl_Role_Interface $role 
    * @param Zend_Acl_Resource_Interface $resource 
    * @param callback $callback 
    */ 
    public function addCallback($role, $resource, $callback) 
    { 
     $role = $this->getRole($role)->getRoleId(); 
     $resource = $this->get($resource)->getResourceId(); 
     $this->_callbacks[$role][$resource] = $callback; 
    } 
} 

사용법 : 당신의 라인을 따라 뭔가를 원하는 것처럼

$acl = new Acl; 
$acl->addResource('page'); 
$acl->addRole('user'); 

$acl->addCallback('user', 'page', function($acl, $role, $resource, $privilege, $result) 
{ 
    return true; 
}); 


$acl->allow('user', 'page', array('read')); 
$acl->isAllowed('user', 'page', 'edit'); //returns true even though 'edit' is not allowed. 

답변

0

는 소리 자신의 페이지.

+0

문제는 자신의 페이지 규칙이 다른 리소스 (데이터베이스에 저장되고 관리 패널에서 편집되기 때문에)입니다. 따라서 페이지에서 isAllowed()가 호출 될 때, 예를 들어 쓰기 액세스가 허용되는지 여부를 확인하려면 사용자가 해당 페이지를 소유 한 경우 "페이지"대신 "자체 페이지"리소스를 테스트해야합니다. 내가 알 수있는 한 주장을 통해이를 수행 할 방법이 없습니다. – Gnuffo1