Php 如何检测角色上的特定拒绝?

Php 如何检测角色上的特定拒绝?,php,zend-framework,jquery-ui-sortable,acl,zend-acl,Php,Zend Framework,Jquery Ui Sortable,Acl,Zend Acl,Zend_Acl默认情况下不允许每个权限上的每个资源使用每个角色,直到或除非 它们是特别允许的。 在我的系统中,用户可以有许多角色,权限分配给这些角色。 我只需让所有用户角色在所有角色上迭代,并检查isAllowed()以获得每个角色的给定资源和权限 例如,如果当前资源为“foo”,权限为“bar” public function checkAllow($roles, $resouse, $privilege) { foreach ($roles as $role) {

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');
在迭代所有角色时,我如何知道给定的角色是特定的“denyied”?
因此,在这一点上,我可以跳出foreach循环并返回
false

好吧,假设我理解这个问题,像这样的东西是你想要的吗? 如果没有,请更好地解释这个问题,以便我能更好地提供帮助

psuedo代码

// 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

好的,我自己通过进入Zend_Acl代码找到了解决方案,结果是Zend_Acl缺少isDenied()方法,它允许()但不允许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;
    }

一旦我知道这是您想要解决的问题,我将添加实际代码来实现这一点。是的,这也是我所期待的。如果您可以提供“is_specified_denied_permission()”实现,这将是我的解决方案。还有一个问题,您是将用户/组/组权限存储在数据库中,还是将其设置在文件中?如果你能建立一个模式?