Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> "Сравнение" ролей в Zend_Acl 
:(
    Опции темы
Ant0ha
Дата 18.2.2011, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 25.3.2009

Репутация: 1
Всего: 2



Есть ресурс - форум (forum). Есть действие - редактирование (edit) постов.
Пользователь не может редактировать посты, кроме своих.
Модератор может редактировать сообщения.
Также в системе есть админ.

Код

$acl = new Zend_Acl();

// Пользователь       
$acl->addRole(new Zend_Acl_Role('user'));
// Модер
$acl->addRole(new Zend_Acl_Role('moder'), 'user');;

// Администатор не наследует управление доступом
$acl->addRole(new Zend_Acl_Role('admin'));
        
// Добавляем ресур - форум
$acl->addResource(new Zend_Acl_Resource('forum'));

// Разрешаем модеру редактирование постов      
$acl->allow('moder', 'forum', array('edit'));
// Админ может всё
$acl->allow('admin');


Получается проверка прав на редактирование сообщения должна выглядеть примерно так:
Код

if($user['user_id'] == $message['user_id'] or $acl->isAllowed($user['role'], 'forum', 'edit')) {
        // Редактируем сообщение
}


Но как в таком случае запретить модерам редактировать сообщения других модеров и админов?

Это сообщение отредактировал(а) Ant0ha - 18.2.2011, 08:21
PM MAIL   Вверх
Ant0ha
Дата 18.2.2011, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 25.3.2009

Репутация: 1
Всего: 2



Можно в сообщении определить роль пользователя, написавшего данное сообщение ($message['role']). Но как сравнить что главнее $message['role'] или $user['role']? Если бы можно было сделать такое сравнение, думаю, проблема была бы решена...
PM MAIL   Вверх
Ant0ha
Дата 18.2.2011, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 25.3.2009

Репутация: 1
Всего: 2



Также нужно будет сделать еще редактирование пользователей, чтоб модер мог редактировать пользователей, но не мог редактировать других модеров и админа.
Админ чтоб мог редактировать пользователей и модеров. При этом возможно в будущем будут еще роли.
Т.е. такое сравнение, имхо, необходимо... Как же в других системах на ZF решается этот вопрос?..
PM MAIL   Вверх
Ant0ha
Дата 18.2.2011, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 25.3.2009

Репутация: 1
Всего: 2



Проблему частично решил, расширив Zend_Acl

Код

class mcAcl extends Zend_Acl
{
   public function __construct()
    {
        // Правила доступа
    }
    
    public function isParent($userRole, $parentRole)
    {
        return isset($this->_roleRegistry->_roles[$userRole]['parents'][$parentRole]);
    }
}


Код

// Разрешаем модеру изменять сообщения пользователя, при этом запрещаем модеру редактировать сообщения модеров и админов
if($acl->isParent($user['role'], $message['role'])) echo 'Действие разрешено';
else echo 'Действие запрещено';


Но при этом пришлось изменить Zend_Acl_Role_Registry::$_roles с protected на public, что не есть гуд.
Если есть какие-нибудь другие предложения, отпишитесь, плз.
PM MAIL   Вверх
Ant0ha
Дата 18.2.2011, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 25.3.2009

Репутация: 1
Всего: 2



И еще вариант без вмешательства в Zend_Acl, думаю, на нем пока остановлюсь, если никто ничего лучше не предложит. 
Просто делать так чтоб посты мог редактировать либо user свои, либо должностное лицо (модер, админ), но только либо свои, либо тех, у кого роль user. Т.е. даже админ не может редактировать посты модеров. 

Примерно так:
Код

if($user['user_id'] == $message['user_id'] or ($acl->isAllowed($user['role'], 'forum', 'edit') && $message['role'] == 'user')) {
    // Редактируем сообщение
}


З.Ы. Вот и поговорили)))
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0498 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.