2011-08-17 27 views
0

Zend_Acl在默认情况下不允许每个角色对每个特权的每个资源直到或者除非特别允许它们使用 。 在我的系统中,一个用户可以有许多角色,权限被分配给这些角色。 我只是让所有用户角色遍历所有用户角色,并检查isAllowed()是否为每个角色提供资源和特权。如何检测角色的具体拒绝?

为e.g如果当前国土资源是“富”和特权“酒吧”

public function checkAllow($roles, $resouse, $privilege) 
{ 

    foreach ($roles as $role) { 
     if ($acl->isAllowed($role, 'foo', 'bar') === true) 
      return true; 
    } 
    return false; 
} 

现在我要实现对这些角色的排序顺序即assinged将有更多的偏好,然后第二个等等的第一个角色。

问题来了,我怎么能检测特定的拒绝像

$this->deny('member','foo','bar'); 

一些角色虽然遍历所有角色,我怎么能知道给定的角色是specificly“denyied”? 所以在那一点上,我可以打破foreach循环,并返回false

回答

0

好,我找到了解决自己通过进入Zend_Acl中的代码以及它的问世是Zend_Acl中缺少isDenied()方法,它isAllowed(),但不isDenied()

我的继承人在类实现isDenied()方法的延伸Zend_Acl里

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; 
    } 
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 

+0

我将添加实际的代码来做到这一点,一旦我知道这是你要解决 – 2011-08-17 18:20:20