Zend ACL списки / уровни множественного доступа - PullRequest
1 голос
/ 04 января 2011

Я создаю портал, к которому могут присоединиться пользователь и компании. Пользователи могут быть независимыми или работать в компании. Существует некоторый базовый доступ, который доступен всем пользователям независимо от их типа (независимый или связанный с компанией). Есть еще некоторые функции, которые доступны для независимых пользователей, но если пользователь находится в компании, менеджер компании сможет разрешить / запретить его доступ к определенным функциям. Как я могу управлять этим с помощью Zend_Acl?

1 Ответ

1 голос
/ 05 января 2011

У ваших ACL могут быть условия.

В файле, где я объявляю свои ACL (кстати, плагин), у меня есть следующее объявление. Acl_AdminCanAccessUsers является Zend_Acl_Assert_Interface и возвращает либо ИСТИНА , либо ЛОЖЬ . Здесь я также передаю объект запроса конструктору.

    // Complex function to see if the current user can create/edit the desired user account.
    $acl->allow('client', 'user', array('edit','create'), new Acl_AdminCanAccessUsers($this->_request));

Теперь давайте посмотрим на Acl_AdminCanAccessUsers

<?php

class Acl_AdminCanAccessUsers implements Zend_Acl_Assert_Interface
{

public function  __construct($request) {
    $this->request = $request;
}

public function  assert(Zend_Acl $acl,
                        Zend_Acl_Role_Interface $role = null,
                        Zend_Acl_Resource_Interface $resource = null,
                        $privilege = null)
{

    /**
     * Can only test when trying to edit a user account
     */
    if ("edit" != $privilege) {
        return TRUE;
    }

    $identity = Zend_Auth::getInstance()->getIdentity();

    /**
     * Get the id from the URL request
     */
    $id = $this->request->getParam('id');

    /**
     * Get user account from DB
     */
    $user = Doctrine_Core::getTable('User')->find($id);

    // Are they editing their own account? Give them a pass
    if ($identity->user_id == $user->user_id) {
        return TRUE;
    }

    // If they don't have the isAdmin flag set to yes on their account
    // Then we'll just deny them immediately
    if ($identity->isAdmin) {
         return TRUE;
    }

    return FALSE;
}
}

Как вы можете видеть здесь, мы проверяем базу данных для пользовательской записи и сравниваем ее с запрашиваемым параметром или проверяем, установлен ли флаг isAdmin в их идентификаторе Zend_Auth. Вы можете выполнить много условных проверок для своих ACL, если есть доступ к ним больше, чем просто роль, ресурс и привилегия.

Счастливого кодирования!

...