И снова Roll-Based Access

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: И снова Roll-Based Access

Сообщение samdark »

Да, этот код позволит сгенерировать auth.php. Мне больше нравится писать его руками.
И про бизрули кто бы объяснил? Не сухим языком руководства, а применительно вот простой задачи. Редактировать свой пост - это бизнесправило? Или операция? Или задача?
Правило — это кусок PHP-кода. Если он даёт true, то роль применяется. Если нет — не применяется.

Редактировать свой пост — это операция. Правило может быть частью операции, роли или задачи.
Виталий
Сообщения: 36
Зарегистрирован: 2009.06.16, 23:21

Re: И снова Roll-Based Access

Сообщение Виталий »

Попытка запустить yiic rbac ожидаемо ни к чему не привела. Ну и ладно. Надеюсь мне тоже понравится писать руками.. Но как? Sam подскажите же наконец, как будет выглядеть аuth.php c приведёнными выше задачами и операциями?
Последний раз редактировалось Виталий 2009.10.13, 22:48, всего редактировалось 1 раз.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: И снова Roll-Based Access

Сообщение samdark »

Выполните приведённый код из действия контроллера и посмотрите на получившийся auth.php.
Виталий
Сообщения: 36
Зарегистрирован: 2009.06.16, 23:21

Re: И снова Roll-Based Access

Сообщение Виталий »

Так его надо руками писать или из контроллера запускать? Какого кстати?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: И снова Roll-Based Access

Сообщение samdark »

Из любого контроллера.
Виталий
Сообщения: 36
Зарегистрирован: 2009.06.16, 23:21

Re: И снова Roll-Based Access

Сообщение Виталий »

В PostController в методе actionAuth написал этот код. Запустил .../index.php?r=post/auth и ничего. Sam пощадите:) Целый день не могу разобраться.А в первом часу ночи тем более. Я понимаю, что приветствуется самостоятельность и т.д. Но если простой копи-паст вызывает проблемы(см начало топика), то тут, с этим rbacom, я сам не смогу разобраться...
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: И снова Roll-Based Access

Сообщение samdark »

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

<?php
return array(
    /**
     * Операции
     */
    // страницы
    'showPage'  => array('type'=>CAuthItem::TYPE_OPERATION, 'description'=>'Просмотр страницы'),

    // пользователи и профили
    'useOwnProfile' => array('type'=>CAuthItem::TYPE_OPERATION, 'description'=>'Пользование своим профилем', 'bizRule' => 'return Yii::app()->user->id==$params["post"]->authID;'),

    /**
     * Роли
     */
    'guest' => array(
        'type' => CAuthItem::TYPE_ROLE,
        'description' => 'Guest',
        'children' => array(
            'showPage',      // просмотр статических страниц
        )
    ),
    'user' => array(
        'type' => CAuthItem::TYPE_ROLE,
        'description' => 'User',
        'children' => array(
            'guest',         // отнаследуемся от гостя
            'useOwnProfile',
        ),
    ),
);

 
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: И снова Roll-Based Access

Сообщение samdark »

Да, сразу предупреждаю, что копи→пейст тут не сработает. Надо вникнуть.
Виталий
Сообщения: 36
Зарегистрирован: 2009.06.16, 23:21

Re: И снова Roll-Based Access

Сообщение Виталий »

Опять бизрули и дата требует...
Вы вчера обещали
Sam Dark писал(а):Хм… с каких, интересно, пор Yii стал без проверки таскать 'bizRule' по индексу? Обязательно проверю и, если всё-таки стал, поправлю в рецепте.
Поправок в рецепте нет. Это значит что только у меня такой глюк?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: И снова Roll-Based Access

Сообщение samdark »

Нет, я просто пока не успел проверить. Сегодня попробую заняться.
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: И снова Roll-Based Access

Сообщение Ekstazi »

Лично у себя я делаю так:
глобальный конфиг:

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

        'user'=>array(
                    'class' => 'WebUser',
                // enable cookie-based authentication
                    'allowAutoLogin'=>true,
        ),
                'authManager'=>array(
                    'class'=>'application.extensions.my.auth.PhpAuthManager',
                    'defaultRoles'=>array('guest'),
                ) 
WebUser.php:

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

class WebUser extends CWebUser{
    private $_model = null;

    public function init(){
        parent::init();
        //Yii::import('application.models.user.User');
    }
    
    public function getRole(){
        return $this->model->role;
    }

    public function getModel(){
        if($this->_model === null){
            $this->_model = User::model()->findByPk($this->id);
        }
        return $this->_model;
    } 

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

class PhpAuthManager extends CPhpAuthManager{
    public function init(){
        parent::init();
        Yii::import('application.extensions.my.auth.checkers.*');
        // Для гостей у нас и так роль по умолчанию guest.
        if(!Yii::app()->user->isGuest){
            // Связываем роль, заданную в БД с идентификатором пользователя,
            // возвращаемым UserIdentity.getId().
            $this->assign(Yii::app()->user->role, Yii::app()->user->id);
        }
    }
    //put your code here
} 
Ну и собственно создание ролей, вынес в отдельный action:

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

    public function actionRoles(){
        $auth=Yii::app()->getAuthManager();
        $auth->clearAll();
    //Post операции
        $auth->createOperation('Post.create','Создание записи','return PostChecker::create($params);');
        $auth->createOperation('Post.read','Просмотр записи','return PostChecker::read($params);');
        $auth->createOperation('Post.update','Редактирование записи','return PostChecker::update($params);');
        $auth->createOperation('Post.delete','Удаление записи','return PostChecker::delete($params);');

        $role=$auth->createRole('user');
        $role->addChild('Post.readOwn');
        $role->addChild('Post.create');
        $role->addChild('Post.updateAndDeleteOwn');

        $role=$auth->createRole('payed');
        $role->addChild('user');

        $role=$auth->createRole('redaktor');
        $role->addChild('payed');

        $role=$auth->createRole('moder');
        $role->addChild('redaktor');

        $role=$auth->createRole('admin');
        $role->addChild('moder');


        $auth->save();
    } 

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

class PostChecker {
    public static function update($params){
    //добавить поддержку сообществ!!!
        return Yii::app()->user->Id==$_GET['user'];
    }

    public static function delete($params){
    //добавить поддержку сообществ!!!
        return Yii::app()->user->Id==$_GET['user'];
    }

    public static function create($params){
        
    }

    public static function read($params){
        
    }
    //put your code here
} 
Думаю все понятно. Если будет время, то может напишу свою систему авторегистрации классов выполняющих функцию проверки доступа для определенной группы ролей.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: И снова Roll-Based Access

Сообщение samdark »

Более красивое решение, чем с базовым контроллером. Можно использовать в рецепте?
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: И снова Roll-Based Access

Сообщение Ekstazi »

Конечно можно, только его сперва доработать надо.
Как будет время сделаю что-то типо такого:

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

function tasks(){
return array(
'Post'=>'PostChecker'
);
function roles(){
return array(
'user'=>array(
array(self::tasks,'Post')
),
'admin'=>array(
array(self::role,'user')
)
)
}
} 
Ну что=то в таком духе. Но сейчас завал на работе, и времени нет думать. Если у тебя есть можем сам заняться этим, а я подключусь как посвободней буду.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: И снова Roll-Based Access

Сообщение samdark »

Мне больше не создание ролей понравилось, а PhpAuthManager вместо базового контроллера.
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: И снова Roll-Based Access

Сообщение Ekstazi »

А, ну так это мы вроде уже обсуждали в топике рецептов.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: И снова Roll-Based Access

Сообщение samdark »

Проверил ситуацию с 'bizRule' на 1.0.9. Работает как раньше, т.е. неиспользуемое в роли перечислять необязательно (по крайней мере у меня это именно так).
Аватара пользователя
badenkov
Сообщения: 79
Зарегистрирован: 2009.06.22, 09:05
Откуда: Ижевск
Контактная информация:

Re: И снова Roll-Based Access

Сообщение badenkov »

Пришлось повозиться с ролями, и пришел к следующему выводу, что здесь нет необходимости ни в переопределении AuthManager-а, ни в базовом контроллере, и не надо хранить у пользователя роль. У себя теперь делаю так,
у меня есть пользователи, и группы.
User (id, username, password), Group (id, title, description, type, role - DEFAULT NULL), GroupUser (groupId, userId).
Каждый пользователь может иметь много групп. Причем группы у меня подразделяются на два типа: системные и общие (просто для группирования пользователей).
Изначально сделал консольную команду, где создаю все операции, задачи и роли. Плюс там же создаю системные группы,
где их полю role присваиваю необходимую роль. В интерфейсе сделал, чтобы системные группы редактировать и удалять было невозможно.
Далее, в создании, редактировании пользователя при привязывании пользователя к группе, если поле role !== NULL
выполняю
$auth->assign($group->role, Yii::app()->user->id) и сохраняю - $auth->save(). И наоборот, при удалении пользователя из группы $auth->revoke
Все сохраняется либо в файл, либо в базу данных. В результате теперь нет запутанности с группами, ролями. Все логично, чтобы разрешить что то пользователю, нужно привязать его к необходимой группе.
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: И снова Roll-Based Access

Сообщение Ekstazi »

тысеча пользователей и CPhpAuthManager - справится ли он ? Это ведь все в одном php файле храниться будет.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: И снова Roll-Based Access

Сообщение samdark »

При записи в файл всё-таки придётся назначать все роли при каждой инициализации приложения. В случае с БД это уже реализовано.
Аватара пользователя
badenkov
Сообщения: 79
Зарегистрирован: 2009.06.22, 09:05
Откуда: Ижевск
Контактная информация:

Re: И снова Roll-Based Access

Сообщение badenkov »

Ну CPhpAuthManager или CDbAuthManager - в зависимости от задач. А assign ролей с пользователей сохраняется и в файл тоже. Просто когда делал интерфейс редактирования ролей, пришлось перед сохранением вызывать revoke, чтобы связи пользователей не сохранялись, а то иначе когда было прописано assign в PhpAuthManager (или в BaseController) вызывалась ошибка, что роль уже связана с пользователем.
Ответить