2011-01-04 4 views
1

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

+0

Вы сначала ознакомились с представлением Zend_Acl, и вы не знаете, как управлять своей задачей? http://framework.zend.com/manual/en/zend.acl.introduction.html –

+0

Я храню acl (роли, ресурсы и разрешения/режим) в db, и есть две разные группы таблиц. Один имеет дело с сайтом, в то время как второй имеет дело с доступом, контролируемым менеджером компании. Итак, как я могу управлять двумя разными типами списков ACL? Детали, приведенные в руководстве, даже не охватывают, как мы можем использовать базу данных для управления acls. Мне удалось достичь этого, но нужно руководствоваться несколькими типами ACL – Bryan

ответ

1

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

В файле, где я объявляю свои ACL (плагин кстати), у меня есть следующее объявление. Acl_AdminCanAccessUsers является Zend_Acl_Assert_Interface и либо вернется TRUE или FALSE. Здесь я также передаю объект Request конструктору.

// 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, если есть больше доступа, чем просто роль, ресурс и привилегия.

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

Смежные вопросы