Zend_Acl默认情况下禁止每个角色上的每个角色,直到或除非 他们是特别允许的。 在我的系统中,用户可以拥有许多角色,并且可以为这些角色提供许可。 我只是让所有用户角色迭代所有用户角色并检查isAllowed()以获得每个角色的给定资源和特权。
例如,如果当前资源是'foo'而特权是'bar'
public function checkAllow($roles, $resouse, $privilege)
{
foreach ($roles as $role) {
if ($acl->isAllowed($role, 'foo', 'bar') === true)
return true;
}
return false;
}
现在我想对这些角色实施排序顺序,即第一个角色被激活后会有更多的偏好,然后是第二个等等。
问题出现了如何检测某些角色的特定拒绝,例如
$this->deny('member','foo','bar');
在迭代所有角色的同时,我如何才能知道给定角色是否具体“被拒绝”?
所以在那时我可以突破foreach循环并返回false
。
答案 0 :(得分:0)
好的,所以假设我提出问题,这就是你要找的东西吗? 如果没有,请更好地解释一下这个问题,以便我能提供更好的帮助。
psuedo-code
// User starts without permission
$has_permission = false
// if any of the users roles have permission set true
foreach $user->roles as $role
// if any of the user's roles allow this permission
if $role->has_permission() == true
$has_permission = true
// if a user is specifically denied a permission that takes precedence
// and immediately kicks the user out
if $role->is_specifically_denied_permission() == true
return false
// return whatever value (true or false) is in $has_permission
return $has_permission
// User starts without permission
$has_permission = false
// if any of the users roles have permission set true
foreach $user->roles as $role
// if any of the user's roles allow this permission
if $role->has_permission() == true
$has_permission = true
// if a user is specifically denied a permission that takes precedence
// and immediately kicks the user out
if $role->is_specifically_denied_permission() == true
return false
// return whatever value (true or false) is in $has_permission
return $has_permission
答案 1 :(得分:0)
好的,我自己通过Zend_Acl代码找到了解决方案,它出来是Zend_Acl缺少isDenied()方法,它有isAllowed()但不是isDenied()
继承我在类中扩展Zend_Acl
的isDenied()方法的实现public function isDenied($roleId,$resource,$privilege)
{
if($this->has($resource) && $this->hasRole($roleId))
{
$roleId = $this->getRole($roleId)->getRoleId();
$resourceId = $this->get($resource)->getResourceId();
return @$this->_rules['byResourceId'][$resourceId]['byRoleId'][$roleId]['byPrivilegeId'][$privilege]['type'] === 'TYPE_DENY';
}
return false;
}