0

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

ここで、これらの役割に並べ替え順序を実装したいと思います。つまり、最初に割り当てられた役割は、2番目よりも優先されます。

問題は、次のようないくつかの役割に対する特定の拒否をどのように検出できるかということです。

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

すべての役割を繰り返しながら、特定の役割が具体的に「拒否」されたことをどのように知ることができますか?したがって、その時点でforeachループから抜け出し、を返すことができますfalse

4

2 に答える 2

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;
    }
于 2011-09-19T02:50:41.960 に答える
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

于 2011-08-17T18:18:49.570 に答える