Я создаю портал, к которому могут присоединиться пользователи и компании. Пользователи могут быть независимыми или работать в компании. Существует некоторый базовый доступ, который доступен всем пользователям независимо от их типа (независимые или связанные с компанией). Есть еще несколько функций, которые доступны для независимых пользователей, но если пользователь находится в компании, менеджер компании сможет разрешить/запретить ему доступ к определенным функциям. Как я могу управлять этим с помощью Zend_Acl?
Zend ACL несколько списков/уровней доступа
comment
вы сначала прочитали введение в Zend_Acl и все еще не знаете, как справиться со своей задачей? framework.zend.com/manual/en/zend.acl.introduction. html
- person Poelinca Dorin   schedule 04.01.2011
comment
Я храню acl (роли, ресурсы и разрешения/режим) в БД, и есть 2 разные группы таблиц. Один занимается сайтом, а второй — доступом, контролируемым менеджером компании. Итак, как я могу управлять двумя разными типами ACL? Подробности, представленные в руководстве, даже не охватывают, как мы можем использовать базу данных для управления списками контроля доступа. Мне удалось добиться этого, но мне нужны некоторые рекомендации относительно нескольких типов ACL.
- person Bryan   schedule 04.01.2011
Ответы (1)
У ваших ACL могут быть условия.
В файле, где я объявляю свои ACL (кстати, плагин), у меня есть следующее объявление. Acl_AdminCanAccessUsers
является Zend_Acl_Assert_Interface
и возвращает либо TRUE, либо FALSE. Здесь я также передаю объект запроса конструктору.
// 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, если вам нужно получить доступ не только к роли, ресурсу и привилегии.
Удачного кодирования!
person
Shane Stillwell
schedule
04.01.2011