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