6


アプリに RBAC を実装しており、すべてがデータベースから管理されています。

たとえば、すべてのリソース/権限を というテーブルに格納しpermission、すべてのロールをroleテーブルに格納し、別のテーブルを呼び出しrole_permissionて、どのロールがどのリソース/権限にアクセスできるかを定義しています。

このアプローチを採用する目的は、アプリの管理者がrole自分でロールを作成して権限を割り当ててもらいたいからです。

アプリのユーザーは、、、、などの複数の役割を持つことができadministratorます。supervisorplayerreferee

Zend_Aclロールとリソースを追加し、権限を割り当てるためのモデル クラスを作成しました。

以下は私がしたことです。

foreach($this->_roles as $role) {
    $this->addRole(new Zend_Acl_Role($role['id']));
}
foreach($this->_permissions as $permmission) {
    $this->addResource(new Zend_Acl_Resource($permmission['id']));
}
foreach($this->_rolePermissions as $value) {
    $this->allow($value['role_id'], $value['permmission_id']);
}
$this->allow($this->_roleAdmin);

たとえば、このコードを使用して、特定の役割に対してアクセス許可が存在するかどうかを確認したい場合は、正常に機能します。

echo $acl->isAllowed($role, $permission) ? 'allowed' : 'denied';

ただし、複数のロールを持つユーザーに対して現在の権限が存在するかどうかを複数のロールで確認したい。

refereeなどの複数のロールを持つユーザーsupervisor がリソースにアクセスできるかどうかを確認するにはどうすればよいですかcreate report。isAllowed() を使用すると、1 つのロールの権限のみを確認できます。

4

1 に答える 1

10

私が通常とるアプローチはZend_Acl、 を拡張するクラスを作成し、関数を拡張して、isAllowed()代わりにユーザー オブジェクトをパラメーターとして使用できるようにすることです。次に、そのユーザーの役割をループして、それぞれのチェックを実行します。例えば:

public function isAllowed($roleOrUser = null, $resource = null, $privilege = null)
{
    if ($roleOrUser instanceof Users_Model_User) {
        // check each of that user's roles
        foreach ($roleOrUser->roles as $role) {
            if (parent::isAllowed($role, $resource, $privilege)) {
                return true;
            }
        }

        return false;
    } else {
        return parent::isAllowed($roleOrUser, $resource, $privilege);
    }
}
于 2013-01-26T19:09:06.060 に答える