Правила доступа по ролям

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
ARACOOL
Сообщения: 68
Зарегистрирован: 2011.05.21, 15:19
Контактная информация:

Правила доступа по ролям

Сообщение ARACOOL »

У каждого пользователя есть своя роль. reader , moderator, administrator
в контроллере создаю такое правило:

Код: Выделить всё

public function accessRules() {
        return array(
            array('allow',
                'actions'=>array('index', 'view', 'update', 'create'),
                'roles'=>array('moderator', 'administrator'),
            ),
            array('allow',
                'actions'=>array('delete', 'admin'),
                'roles'=>array('administrator'),
            ),
        );
    }
 
Получается при action admin moderator не имеет доступа к действию. Но не работает когда у пользователя роль модератора он получает доступ к действию admin
Dismal
Сообщения: 247
Зарегистрирован: 2011.10.16, 13:25

Re: Правила доступа по ролям

Сообщение Dismal »

В конце не забудьте:

Код: Выделить всё

array('deny',  // deny all users
                'users'=>array('*'),
            ), 
Аватара пользователя
ARACOOL
Сообщения: 68
Зарегистрирован: 2011.05.21, 15:19
Контактная информация:

Re: Правила доступа по ролям

Сообщение ARACOOL »

Получилось такое правило

Код: Выделить всё

return array(
            array('allow',
                'actions'=>array('index', 'view', 'update', 'create'),
                'roles'=>array('moderator', 'administrator'),
            ),
            array('allow',
                'actions'=>array('delete', 'admin'),
                'roles'=>array('administrator'),
            ),
            array('deny',
                'users'=>array('*'),
            ),
        ); 
Теперь я меняю роль на administrator и нет доступа. Ни для одной роли.
Проверяю роль пользователя Yii::app()->user->role
spavlov
Сообщения: 66
Зарегистрирован: 2011.07.29, 10:42

Re: Правила доступа по ролям

Сообщение spavlov »

а разве "администратор" не наследуется от модератор? если да, то

Код: Выделить всё

return array(
            array('allow',
                'actions'=>array('index', 'view', 'update', 'create'),
                'roles'=>array('moderator'),
            ),
            array('allow',
                'actions'=>array('delete', 'admin'),
                'roles'=>array('administrator'),
            ),
            array('deny',
                'users'=>array('*'),
            ),
        );  
Аватара пользователя
ARACOOL
Сообщения: 68
Зарегистрирован: 2011.05.21, 15:19
Контактная информация:

Re: Правила доступа по ролям

Сообщение ARACOOL »

Код: Выделить всё

public function accessRules() {
        return array(
            array('allow',
                'actions'=>array('index', 'view', 'update', 'create'),
                'roles'=>array('moderator'),
            ),
            array('allow',
                'actions'=>array('delete', 'admin'),
                'roles'=>array('administrator'),
            ),
            array('deny',
                'users'=>array('*'),
            ),
        );
    } 
Сделал так, роль администратор и все равно нет доступа
Johnatan
Сообщения: 167
Зарегистрирован: 2010.10.27, 13:06
Откуда: Reino de España

Re: Правила доступа по ролям

Сообщение Johnatan »

Покажите файл с ролями. Имхо у вас нет наследования ролей.
Конференция: [email protected]
Аватара пользователя
ARACOOL
Сообщения: 68
Зарегистрирован: 2011.05.21, 15:19
Контактная информация:

Re: Правила доступа по ролям

Сообщение ARACOOL »

Это правила с ролями:

Код: Выделить всё

<?php
return array (
  'post_create' => 
  array (
    'type' => 0,
    'description' => 'создание записи',
    'bizRule' => NULL,
    'data' => NULL,
  ),
  'post_read' => 
  array (
    'type' => 0,
    'description' => 'просмотр записи',
    'bizRule' => NULL,
    'data' => NULL,
  ),
  'post_update' => 
  array (
    'type' => 0,
    'description' => 'редактирование записи',
    'bizRule' => NULL,
    'data' => NULL,
  ),
  'post_delete' => 
  array (
    'type' => 0,
    'description' => 'удаление записи',
    'bizRule' => NULL,
    'data' => NULL,
  ),
  'comment_create' => 
  array (
    'type' => 0,
    'description' => 'создание комментария',
    'bizRule' => NULL,
    'data' => NULL,
  ),
  'comment_read' => 
  array (
    'type' => 0,
    'description' => 'просмотр комментария',
    'bizRule' => NULL,
    'data' => NULL,
  ),
  'comment_update' => 
  array (
    'type' => 0,
    'description' => 'редактирование запикомментарияси',
    'bizRule' => NULL,
    'data' => NULL,
  ),
  'comment_delete' => 
  array (
    'type' => 0,
    'description' => 'удаление комментария',
    'bizRule' => NULL,
    'data' => NULL,
  ),
  'user_create' => 
  array (
    'type' => 0,
    'description' => 'создание пользователя',
    'bizRule' => NULL,
    'data' => NULL,
  ),
  'user_read' => 
  array (
    'type' => 0,
    'description' => 'просмотр пользователя',
    'bizRule' => NULL,
    'data' => NULL,
  ),
  'user_update' => 
  array (
    'type' => 0,
    'description' => 'редактирование пользователя',
    'bizRule' => NULL,
    'data' => NULL,
  ),
  'user_delete' => 
  array (
    'type' => 0,
    'description' => 'удаление пользователя',
    'bizRule' => NULL,
    'data' => NULL,
  ),
  'category_create' => 
  array (
    'type' => 0,
    'description' => 'создание категории',
    'bizRule' => NULL,
    'data' => NULL,
  ),
  'category_read' => 
  array (
    'type' => 0,
    'description' => 'просмотр категории',
    'bizRule' => NULL,
    'data' => NULL,
  ),
  'category_update' => 
  array (
    'type' => 0,
    'description' => 'редактирование категории',
    'bizRule' => NULL,
    'data' => NULL,
  ),
  'category_delete' => 
  array (
    'type' => 0,
    'description' => 'удаление категории',
    'bizRule' => NULL,
    'data' => NULL,
  ),
  'reader' => 
  array (
    'type' => 2,
    'description' => '',
    'bizRule' => NULL,
    'data' => NULL,
    'children' => 
    array (
      0 => 'post_read',
      1 => 'comment_create',
      2 => 'comment_read',
    ),
  ),
  'moderator' => 
  array (
    'type' => 2,
    'description' => '',
    'bizRule' => NULL,
    'data' => NULL,
    'children' => 
    array (
      0 => 'reader',
      1 => 'post_create',
      2 => 'post_update',
      3 => 'comment_update',
    ),
  ),
  'administrator' => 
  array (
    'type' => 2,
    'description' => '',
    'bizRule' => NULL,
    'data' => NULL,
    'children' => 
    array (
      0 => 'moderator',
      1 => 'post_delete',
      2 => 'comment_delete',
      3 => 'user_create',
      4 => 'user_read',
      5 => 'user_update',
      6 => 'user_delete',
      7 => 'category_create',
      8 => 'category_read',
      9 => 'category_update',
      10 => 'category_delete',
    ),
  ),
);
 
Vic
Сообщения: 109
Зарегистрирован: 2010.03.12, 01:55

Re: Правила доступа по ролям

Сообщение Vic »

Проверьте, что дает такая конструкция

Код: Выделить всё

foreach(array('moderator', 'administrator', 'reader') As $v)
  echo $v . ' = ' .(Yii::app()->user->checkAccess($v)?'yes':'no');
 
и поставьте такое во все действия в accessRules вместо ролей

Код: Выделить всё

'users'=>array('*'),
 
А то, может, роль не связана с пользователем?
Аватара пользователя
ARACOOL
Сообщения: 68
Зарегистрирован: 2011.05.21, 15:19
Контактная информация:

Re: Правила доступа по ролям

Сообщение ARACOOL »

Конструкция вывела такое moderator = noadministrator = noreader = no

Если я поставлю так 'users'=>array('*'), то как мне проверять, какие действия доступны для какой роли. Можно в каждом методе проверять типа

Код: Выделить всё

Yii::app()->user->checkAccess('post_create') 
Роль связываю с ID пользователя так

Код: Выделить всё

public function init() {
        parent::init();
        if(!Yii::app()->user->getIsGuest()) {
            $this->assign(Yii::app()->user->role, Yii::app()->user->id);
        }
    } 
И при проверке Yii::app()->user-role я получаю текущую роль пользователя
Vic
Сообщения: 109
Зарегистрирован: 2010.03.12, 01:55

Re: Правила доступа по ролям

Сообщение Vic »

Вот если добавить пробельчик в конце, то получим более читаемое:
ARACOOL писал(а):Конструкция вывела такое
moderator = no
administrator = no
reader = no
Значит, прав никаких нет :(
Значит, надо смотерть, все ли правильно сделано по мануалу по связыванию роли с текущим залогиненным пользователем.
ARACOOL писал(а): Если я поставлю так 'users'=>array('*'), то как мне проверять, какие действия доступны для какой роли.
А это нужно, чтобы выполнилась конструкция, которую я написал. Потом, когда роль свяжется с текущим пользователем, можно уже и правильные роли восстановить.
Аватара пользователя
ARACOOL
Сообщения: 68
Зарегистрирован: 2011.05.21, 15:19
Контактная информация:

Re: Правила доступа по ролям

Сообщение ARACOOL »

Заработало все! Ошибка была в следующем. Роль не призывалась к ID пользователя потому что в настройках компонент authManager был указан как auth a нет authManager.
Ответить