RBAC и описание ролей в файле

Обсуждение документации. Переводы Cookbook и авторские рецепты.
bestxp
Сообщения: 4
Зарегистрирован: 2013.07.02, 13:46

Re: RBAC и описание ролей в файле

Сообщение bestxp »

но в итоге при проверке я получаю false . есть проверяю админа на то что он модератор, хотя вот операции он верно находит, а роль не может понять, почему то
alex3d
Сообщения: 19
Зарегистрирован: 2011.10.13, 13:06

Re: RBAC и описание ролей в файле

Сообщение alex3d »

Help please!
Вроде сделал всё как следует, не пойму что упустил:
main.php

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

'components'=>array(
        'user'=>array(
                            'class' => 'WebUser',
        // enable cookie-based authentication
        'allowAutoLogin'=>true,
        ),
...
                         'authManager'=>array(
                             'class'=>'PhpAuthManager',
                             'connectionID'=>'db',
        ),
 
Файлы PhpAuthManager и WebUser лежат абсолютно без изменений в папке components

В итоге при прописывании к моему модулю админки, одному из контроллеров правила accessRules для роли "admin" (в базе есть такой пользователь и такая текстовая роль - логинится нормально, не проходит именно по правилам accessRules):

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

                                     array('allow', 
                'actions'=>array('admin','delete'),
                'roles'=>array('admin'),
            ),
 
Выдает ошибку:
CException Не определено свойство "PhpAuthManager.connectionID".

Stack Trace
#0 Z:\home\localhost\www\Yii\framework\YiiBase.php(220): CComponent->__set("connectionID", "db")
#1 + Z:\home\localhost\www\Yii\framework\base\CModule.php(386): YiiBase::createComponent(array("class" => "PhpAuthManager", "connectionID" => "db"))
#2 + Z:\home\localhost\www\Yii\framework\web\CWebApplication.php(185): CModule->getComponent("authManager")
#3 + Z:\home\localhost\www\Yii\framework\web\auth\CWebUser.php(806): CWebApplication->getAuthManager()
#4 + Z:\home\localhost\www\Yii\framework\web\auth\CAccessControlFilter.php(338): CWebUser->checkAccess("admin")
Что может быть?
alex3d
Сообщения: 19
Зарегистрирован: 2011.10.13, 13:06

Re: RBAC и описание ролей в файле

Сообщение alex3d »

Простите, туплю - 2 часа смотрел на код что может быть не так, а оказалось что у меня в

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

'authManager' => array(
    // Будем использовать свой менеджер авторизации
    'class' => 'PhpAuthManager',
    // Роль по умолчанию. Все, кто не админы, модераторы и юзеры — гости.
    'defaultRoles' => array('guest'),
),
 
еще осталась строка ConnectionID=db оставшаяся от экспериментов с CDbAuthManager :roll: )))
alex3d
Сообщения: 19
Зарегистрирован: 2011.10.13, 13:06

Re: RBAC и описание ролей в файле

Сообщение alex3d »

Без бизнес-правил всё работает отлично.
Понадобилось прикрутить правило, при котором только владелец может выполнять определенное действие:

auth.php:

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

'manageOwnInfocentre'=>array(
            'type'=>CAuthItem::TYPE_ROLE,
            'description'=>'Операції зі створення, редагування та видалення ВЛАСНИХ елементів Інфо-центру',
            'bizRule' => 'return Yii::app()->user->id==$params["owner_id"];',
            'data' => null
            ),

'manageInfocentre'=>array(
            'type'=>CAuthItem::TYPE_ROLE,
            'description'=>'Операції зі створення, редагування та видалення ВСІХ елементів Інфо-центру',
           'children' => array(
                  'manageOwnInfocentre',
              ),
            'bizRule' => null,
            'data' => null
            ),
во вьюхе:

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

if (Yii::app()->user->checkAccess('manageOwnInfocentre',array('owner_id'=>$data['owner_id']))) ...
Если у пользователя стоит роль 'manageOwnInfocentre' и это его элемент - все ок, срабатывает только в таком случае бизнес-правило.
Но я полагал, что пользователь с уровнем manageInfocentre (его родитель) сможет также пройти эту проверку так как полагал, что если у manageInfocentre 'bizRule' => null и это более высший уровень доступа - должен был бы пустить....
Думал, что смогу избавиться от конструкций, которые я сейчас использую:

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

if (Yii::app()->user->checkAccess('manageInfocentre') || Yii::app()->user->checkAccess('manageOwnInfocentre',array('owner_id'=>$data['owner_id']))) ...
Подскажите, пожалуйста, как реализовать бизнес-правила как следует в моем случае?
drax08
Сообщения: 16
Зарегистрирован: 2013.10.22, 18:53

Re: RBAC и описание ролей в файле

Сообщение drax08 »

Всем доброго время суток
Разбираюсь с правами доступа, уже сделал полный копипаст с рецепта, но ошибка остаётся та же

При обработке кода:

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

if (!Yii::app()->user->checkAccess('administrator')) {
            echo "hello, I'm administrator";
        }
Выдаёт ошибку:
Неизвестный элемент авторизации "administrator".

Причём не важно что писать в checkAccess, элемент авторизации в ошибке меняется на роль пользователя, под которым зашёл.
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: RBAC и описание ролей в файле

Сообщение futbolim »

drax08 писал(а):Всем доброго время суток
Разбираюсь с правами доступа, уже сделал полный копипаст с рецепта, но ошибка остаётся та же

При обработке кода:

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

if (!Yii::app()->user->checkAccess('administrator')) {
            echo "hello, I'm administrator";
        } 
Выдаёт ошибку:
Неизвестный элемент авторизации "administrator".

Причём не важно что писать в checkAccess, элемент авторизации в ошибке меняется на роль пользователя, под которым зашёл.
Покажите свой auth.php
Аватара пользователя
vova07
Сообщения: 1004
Зарегистрирован: 2012.11.29, 14:52
Откуда: Chisinau, Moldova

Re: RBAC и описание ролей в файле

Сообщение vova07 »

Убедитесь что $this->authFile=Yii::getPathOfAlias('application.config.auth').'.php'; введет на существующий файл. может опечатка, или алиас не тот.
Если все ок, проверьте если в файле есть элемент массива с ключем нужной роли.
drax08
Сообщения: 16
Зарегистрирован: 2013.10.22, 18:53

Re: RBAC и описание ролей в файле

Сообщение drax08 »

Покажите свой auth.php

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

return array(
    'guest' => array(
        'type' => CAuthItem::TYPE_ROLE,
        'description' => 'Guest',
        'bizRule' => NULL,
        'data' => NULL
    ),
    'user' => array(
        'type' => CAuthItem::TYPE_ROLE,
        'description' => 'User',
        'children' => array(
            'guest', // унаследуемся от гостя
        ),
        'bizRule' => NULL,
        'data' => NULL
    ),
    'moderator' => array(
        'type' => CAuthItem::TYPE_ROLE,
        'description' => 'Moderator',
        'children' => array(
            'user', // позволим модератору всё, что позволено пользователю
        ),
        'bizRule' => NULL,
        'data' => NULL
    ),
    'administrator' => array(
        'type' => CAuthItem::TYPE_ROLE,
        'description' => 'Administrator',
        'children' => array(
            'moderator', // позволим админу всё, что позволено модератору
        ),
        'bizRule' => NULL,
        'data' => NULL
    ),
); 
Убедитесь что $this->authFile=Yii::getPathOfAlias('application.config.auth').'.php'; введет на существующий файл. может опечатка, или алиас не тот.
../protected/config/auth.php

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

echo Yii::app()->user->role; 
на выходе administrator
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: RBAC и описание ролей в файле

Сообщение futbolim »

drax08 писал(а):
Покажите свой auth.php

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

return array(
    'guest' => array(
        'type' => CAuthItem::TYPE_ROLE,
        'description' => 'Guest',
        'bizRule' => NULL,
        'data' => NULL
    ),
    'user' => array(
        'type' => CAuthItem::TYPE_ROLE,
        'description' => 'User',
        'children' => array(
            'guest', // унаследуемся от гостя
        ),
        'bizRule' => NULL,
        'data' => NULL
    ),
    'moderator' => array(
        'type' => CAuthItem::TYPE_ROLE,
        'description' => 'Moderator',
        'children' => array(
            'user', // позволим модератору всё, что позволено пользователю
        ),
        'bizRule' => NULL,
        'data' => NULL
    ),
    'administrator' => array(
        'type' => CAuthItem::TYPE_ROLE,
        'description' => 'Administrator',
        'children' => array(
            'moderator', // позволим админу всё, что позволено модератору
        ),
        'bizRule' => NULL,
        'data' => NULL
    ),
);
Убедитесь что $this->authFile=Yii::getPathOfAlias('application.config.auth').'.php'; введет на существующий файл. может опечатка, или алиас не тот.
../protected/config/auth.php

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

echo Yii::app()->user->role;
на выходе administrator
Теперь конфиг и PhpAuthManager
drax08
Сообщения: 16
Зарегистрирован: 2013.10.22, 18:53

Re: RBAC и описание ролей в файле

Сообщение drax08 »

Теперь конфиг и PhpAuthManager

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

'user' => array(
            'class' => 'WebUser',
            // enable cookie-based authentication
            'allowAutoLogin' => true,
        ),
...
'authManager' => array(
            'class' => 'PhpAuthManager',
            'defaultRoles' => array('guest'),
        ),

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

class PhpAuthManager extends CPhpAuthManager
{
    public function init()
    {

// Иерархию ролей расположим в файле auth.php в директории config приложения
        if ($this->authFile === NULL) {
            $this->authFile = Yii::getPathOfAlias('application.config.auth') . '.php';
        }

        parent::init();
// Для гостей у нас и так роль по умолчанию guest.
        if (!Yii::app()->user->isGuest) {
// Связываем роль, заданную в БД с идентификатором пользователя,
// возвращаемым UserIdentity.getId().
            $this->assign(Yii::app()->user->role, Yii::app()->user->id);
        }
    }
}
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: RBAC и описание ролей в файле

Сообщение futbolim »

Дебажьте. Вроде всё норм.
drax08
Сообщения: 16
Зарегистрирован: 2013.10.22, 18:53

Re: RBAC и описание ролей в файле

Сообщение drax08 »

Дебажьте. Вроде всё норм.
Извините, может немного глупый вопрос

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

public function assign($itemName,$userId,$bizRule=null,$data=null)
    {
        if(!isset($this->_items[$itemName]))
            throw new CException(Yii::t('yii','Unknown authorization item "{name}".',array('{name}'=>$itemName)));
        elseif(isset($this->_assignments[$userId][$itemName]))
            throw new CException(Yii::t('yii','Authorization item "{item}" has already been assigned to user "{user}".',
                array('{item}'=>$itemName,'{user}'=>$userId)));
        else
            return $this->_assignments[$userId][$itemName]=new CAuthAssignment($this,$itemName,$userId,$bizRule,$data);
    }
Ошибка в этой функции, и нормально что массив $this->_items пустой? и если не нормально, то как он наполняется и в чём может быть причина?
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: RBAC и описание ролей в файле

Сообщение futbolim »

drax08 писал(а):
Дебажьте. Вроде всё норм.
Извините, может немного глупый вопрос

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

public function assign($itemName,$userId,$bizRule=null,$data=null)
    {
        if(!isset($this->_items[$itemName]))
            throw new CException(Yii::t('yii','Unknown authorization item "{name}".',array('{name}'=>$itemName)));
        elseif(isset($this->_assignments[$userId][$itemName]))
            throw new CException(Yii::t('yii','Authorization item "{item}" has already been assigned to user "{user}".',
                array('{item}'=>$itemName,'{user}'=>$userId)));
        else
            return $this->_assignments[$userId][$itemName]=new CAuthAssignment($this,$itemName,$userId,$bizRule,$data);
    } 
Ошибка в этой функции, и нормально что массив $this->_items пустой? и если не нормально, то как он наполняется и в чём может быть причина?
Не нормально. Причину - дебажьте.
drax08
Сообщения: 16
Зарегистрирован: 2013.10.22, 18:53

Re: RBAC и описание ролей в файле

Сообщение drax08 »

Спасибо всем за помощь)

Взял с GitHub файл CPhpAuthManager.php, заменил на тот что у меня был и всё заработало)
Антон
Сообщения: 199
Зарегистрирован: 2013.08.29, 05:27
Откуда: Харьков

Re: RBAC и описание ролей в файле

Сообщение Антон »

А как в accessRules() указать что может только модератор выполнять? или админ
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: RBAC и описание ролей в файле

Сообщение futbolim »

Антон писал(а):А как в accessRules() указать что может только модератор выполнять? или админ
http://yiiframework.ru/doc/guide/ru/topics.auth
Антон
Сообщения: 199
Зарегистрирован: 2013.08.29, 05:27
Откуда: Харьков

Re: RBAC и описание ролей в файле

Сообщение Антон »

Не конкретный пользователь, а группа.
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: RBAC и описание ролей в файле

Сообщение futbolim »

Антон писал(а):Не конкретный пользователь, а группа.
http://yiiframework.ru/doc/guide/ru/topics.auth
aleksp
Сообщения: 12
Зарегистрирован: 2011.07.26, 12:38

Re: RBAC и описание ролей в файле

Сообщение aleksp »

В "Приложение 1: модель User" этот код разве будет корректно работать?

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

    protected function beforeSave(){
        $this->password = md5($this->password);
        return parent::beforeSave();
    }
При следующем обновлении уже существующего пользователя запишется хеш от хеша.
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: RBAC и описание ролей в файле

Сообщение futbolim »

aleksp писал(а):В "Приложение 1: модель User" этот код разве будет корректно работать?

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

    protected function beforeSave(){
        $this->password = md5($this->password);
        return parent::beforeSave();
    } 
При следующем обновлении уже существующего пользователя запишется хеш от хеша.
if(...) unset $pass
Ответить