Назначить несколько ролей в Zend_Navigation, используя Zend_ACL в Zend Framework PHP? - PullRequest
1 голос
/ 05 сентября 2011

Я не могу заставить мою Zend_Navigation работать нормально,

При входе в систему с помощью AUth / Doctrine я вытаскиваю роли, назначенные пользователю (обычно это несколько из них), из таблицы «многие ко многим»,

Затем в bootstrap.php в строке: $ View-> навигация ($ navContainer) -> SetACL ($ это -> _ ACL) -> setRole ($ это -> _ роль);

Я получаю ошибку: '$ role должен быть строкой, нулем или экземпляром Zend_Acl_Role_Interface; массив задан '

Однако, если я перебираю роли с помощью foreach - предыдущие роли перезаписываются следующими, и я получаю навигацию только для последней роли,

У кого-нибудь есть логическое решение для этого?

Действительно ценю, Адам

Ответы [ 2 ]

1 голос
/ 22 марта 2013

У меня была та же проблема, но я подошел к решению под немного другим углом.Вместо того, чтобы модифицировать объект Zend_Navigation для принятия двух или более ролей, я расширил Zend_Acl и изменил метод isAllowed() для проверки всех этих ролей.Объекты Zend_Navigation используют метод isAllowed(), поэтому переопределение этого решило проблему.

My_Acl.php

<pre><code>
class My_Acl extends Zend_Acl
{
    public function isAllowed($role = null, $resource = null, $privilege = null)
    {
        // Get all the roles to check against
        $userRoles = Zend_Registry::get('aclUserRoles');
        $isAllowed = false;

        // Loop through them one by one and check if they're allowed
        foreach ($userRoles as $role)
        {
            // Using the actual ACL isAllowed method here
            if (parent::isAllowed($role->code, $resource))
            {
                $isAllowed = true;
            }
        }

        return $isAllowed;
    }
}

Тогдавместо создания экземпляра Zend_Acl используйте My_Acl, передайте его своему навигационному объекту, и он должен работать.

0 голосов
/ 16 августа 2013

Вы действительно никогда не должны переопределять isAllowed (), и да, есть решение. Создайте класс, который реализует Zend_Acl_Role_Interface, и, если память обслуживает, он требует определения одного метода getRole (), фактически это может быть ваша модель, которую вы используете для аутентификации пользователя и позволяете этому классу обрабатывать определение роли. Пользователь должен иметь только одну роль. Если доступ к ресурсу должен быть предоставлен пользователям нескольких ролей, но только при определенных условиях, вам следует использовать утверждение, поэтому они там есть.

...