как должен выглядеть настоящий auth.php

[font="Courier New"]PHP Error

Description

Undefined index: bizRule

Source File

D:\WAPPStack\apache2\htdocs\framework\web\auth\CPhpAuthManager.php(450)[/font]

сейчас auth.php выглядит типа:

[font="Courier New"]

'admin' => array(


    'type' => CAuthItem::TYPE_ROLE,


    'description' => 'admin',


    'children' => array(


        'manager',


    ),


),[/font]

как бизнесправила описывать если их хранить в файле?




<?php

return array (

  'admin' => 

  array (

    'type' => 2,

    'description' => '',

    'bizRule' => NULL,

    'data' => NULL,

    'assignments' => 

    array (

      1 => 

      array (

        'bizRule' => NULL,

        'data' => NULL,

      ),

    ),

  ),

  'user' => 

  array (

    'type' => 2,

    'description' => '',

    'bizRule' => NULL,

    'data' => NULL,

    'assignments' => 

    array (

      5 => 

      array (

        'bizRule' => NULL,

        'data' => NULL,

      ),

      6 => 

      array (

        'bizRule' => NULL,

        'data' => NULL,

      ),

      2 => 

      array (

        'bizRule' => NULL,

        'data' => NULL,

      ),

    ),

  ),

);

?>



В соответствующих местах - нужные правила.

А вообще этот файл создаётся при выполнении Yii::app()->authManager->save(). А все роли, правила и т.д. создаются специальными методами.

Почитайте про аутентификацию и авторизацию.

Ну и помните, что для этого нужно сконфигурировать authManager:




'components'=>array(

    ...

    'authManager'=> array (

                'class'=>'CPhpAuthManager',

            ),

    ...

),




  'admin' => 

  array (

    'type' => 2,

    'description' => '',

    'bizRule' => NULL,

    'data' => NULL,

    'assignments' => 

    array (

      1 => 

      array (

        'bizRule' => NULL,

        'data' => NULL,

      ),

    ),

  ),

то есть, правило называется админ, которое справедливо если в ‘bizRule’ будет выполнятся условие?

да встречал ваш пост

но правила вы там не описываете как я поянл

Здесь admin - Роль (не правило).

Если нужно повесить на неё какое-либо дополнительное условие - ‘bizRule’ к вашим услугам. Ещё раз. Пример из документации:




$auth=Yii::app()->authManager;

 

$auth->createOperation('createPost','создание записи');

$auth->createOperation('readPost','просмотр записи');

$auth->createOperation('updatePost','редактирование записи');

$auth->createOperation('deletePost','удаление записи');

 

$bizRule='return Yii::app()->user->id==$params["post"]->authID;';

$task=$auth->createTask('updateOwnPost','редактирование своей записи',$bizRule);

$task->addChild('updatePost');

 

$role=$auth->createRole('reader');

$role->addChild('readPost');

 

$role=$auth->createRole('author');

$role->addChild('reader');

$role->addChild('createPost');

$role->addChild('updateOwnPost');

 

$role=$auth->createRole('editor');

$role->addChild('reader');

$role->addChild('updatePost');

 

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

$role->addChild('editor');

$role->addChild('author');

$role->addChild('deletePost');

 

$auth->assign('reader','readerA');

$auth->assign('author','authorB');

$auth->assign('editor','editorC');

$auth->assign('admin','adminD');



Здесь условие задаётся для задачи ‘updateOwnPost’ содержащей операцию ‘upddatePost’.




$bizRule='return Yii::app()->user->id==$params["post"]->authID;';

$task=$auth->createTask('updateOwnPost','редактирование своей записи',$bizRule);

$task->addChild('updatePost');



А эта задача потом добавляется к роли ‘author’.




role=$auth->createRole('author');

...

$role->addChild('updateOwnPost');



Далее пользователю с id ‘authorB’ ставится в соответсвие роль ‘author’.




$auth->assign('author','authorB');



Теперь пользователь с id ‘authorB’ сможет редактировать пост, если является его автором.

А скажите пожалуйста, а как привязать операцию, тоесть ‘createPost’ к определённому экшну, например есть контроллер Post и в нём экшн actionCreate?

Я за CDbAuthManager. Так проще работать с динамически формированными группами и расширять в целом проект. Хотя ничего не мешает использовать CPhpAuthManager и написать для него удобный парсер и встроить в админку.

Из документации:




Проверка доступа


Для проверки доступа нам необходимо знать имя элемента авторизации. К примеру, чтобы проверить, может ли текущий пользователь создать запись, необходимо узнать, имеет ли он права, описанные операцией createPost. После этого мы можем вызвать CWebUser::checkAccess:

if(Yii::app()->user->checkAccess('createPost'))

{

    // создаём запись

}



С ролями проще. Достаточно:




 public function accessRules()

    {

        return array(

            array('allow',

                'actions'=>array('delete'),

                'roles'=>array('admin'),

            ),

            array('deny',

                'users'=>array('*'),

            ),

        );

    }



Операции и есть роли. Оба куска кода будут работать и с операциями и с ролями.

С RBAC только разбираюсь.

такой "auth.php":




    'user' => array(

        'type' => CAuthItem::TYPE_ROLE,

        'description' => 'User',

        'bizRule' => NULL,

        'data' => NULL,

        'children' => array(

            'guest', // отнаследуемся от гостя

        ),

    ),

    'owner' => array(

        'type' => CAuthItem::TYPE_ROLE,

        'description' => 'User',

        'bizRule' => 'return Yii::app()->user->id==$_GET["id"];',

        'data' => NULL,

        'children' => array(

            'user',

        ),

    ),

    'admin' => array(

        'type' => CAuthItem::TYPE_ROLE,

        'description' => 'Administrator',

        'bizRule' => NULL,

        'data' => NULL,

        'children' => array(

            'user','owner',

        ),

    ),



У меня admin родитель для owner, но редактировать персональные данные любого пользователя админу не дает.

Кроме того, владельцу тоже!

В чем я не прав?

Все хвалят "CDbAuthManager", а как там прописывать права и обязанности?

Права лучше не писать в auth.php, а использовать метод save():




$auth=Yii::app()->authManager;

 

$auth->createOperation('createPost','создание записи');

...

$auth->save();



При этом если используется CPhpAuthManager, то права сохранятся в php файл, если CDbAuthManager - то в базу.

Чтобы права заработали для пользователей нужно еще вызывать assign(), я делал так:




        $auth=Yii::app()->authManager;


        $auth->clearAll();


        //создаем операции

        $op = $auth->createOperation('StudentPage','View Student\'s Page');        

        $op = $auth->createOperation('UsersViewSchool','Users - view School');

        $op = $auth->createOperation('UsersViewAll','Users - view all');

        $op->addChild('UsersViewSchool');

        $op = $auth->createOperation('UsersEditSchool','Users - Edit School');

        $op->addChild('UsersViewSchool');        

        $op = $auth->createOperation('UsersEditAll','Users - edit all');

        $op->addChild('UsersViewAll');

        $op->addChild('UsersEditSchool');


        ...


        //проходим по таблице "типы пользователей", для каждого типа создаем RBAC роль и назначаем роли права

        $userTypes = UserType::model()->findAll();

        foreach($userTypes as $userType) {

            $role = $auth->createRole($userType->name);

            if ($userType->name == 'student') {

                $role->addChild('StudentPage');

            }

            if ($userType->name == 'teacher') {

                $role->addChild('UsersViewSchool');

                $role->addChild('ClassesViewSchool');

                ...  

            }

            if ($userType->name == 'admin') {

                $role->addChild('UsersViewSchool');

                $role->addChild('UsersEditSchool');

                ...

            }

        }


        // назначаем роли пользователям

        $users = User::model()->findAll();

        foreach($users as $user) {

            $auth->assign($user->userType->name, $user->id);

        }


        // сохраняем назначенные права

        $auth->save();



В последнем цикле, помеченном как "назначаем роли пользователям", как раз и происходит назначение прав существующим пользователям.

В моем случае есть несколько типов пользователей (студент, учитель, админ), каждому из которых досупны разные операции.

Приведенный код выполняется только один раз, при начальной инициализации ролей. Дальше для динамической настройки прав используется модифицированная версия расширения srbac. После сохранения пользователя, права для него переназначаются на основании зданного типа пользователя:




protected function afterSave()

    {

        $auth = Yii::app()->authManager;

        

        // удаляем все назначенные права

        $items = $auth->getRoles($this->id);

        foreach ($items as $item) {

            $auth->revoke($item->name, $this->id);

        }

        

        // назначаем роль

        $auth->assign($this->userType->name, $this->id);

        $auth->save();


        parent::afterSave();

    }



При настройке прав учитывайте, что на самом деле операции (operations), задачи (tasks) и роли (roles) - это одно и то же. Разные названия только для логического разделения прав по смыслу.

И еще, это не совсем очевидно, но в контроллерах удобнее разграничивать права доступа не по ролям, а по отдельным операциям.

Например, есть операция "UsersViewSchool" - это просмотр данных, связанных со школой. Данная операция доступна (назначена) учителю и админу, но не студенту. В контроллере права доступа описаны так:




    public function accessRules()

    {

        return array(

            array('allow',  

                // действия 'student', 'startLesson' доступны всем пользователям у которых есть права

                // на опреации 'StudentPage', 'UsersViewSchool'

                'actions'=>array('student', 'startLesson'),

                'roles'=>array('StudentPage', 'UsersViewSchool')

            ),

            array('allow',

                // действия 'admin','show','assignCourses' доступны пользователям с правом на 'UsersViewSchool'

                'actions'=>array('admin','show','assignCourses'),

                'roles'=>array('UsersViewSchool') //'UsersViewAll'

            ),

            array('allow', 

                // остальные действия доступны пользователям с правом на 'UsersEditSchool' 

                'actions'=>array('delete', 'create','update', 'getClassesList', 'getCoursesList'), 

                'roles'=>array('UsersEditSchool') //'UsersEditAll'

            ),            

            array('deny',  // deny all users

                'users'=>array('*'),

            ),

        );

    }



Огромное спасибо, Seb.

[quote=“seb, post:12, topic:18401”]

Права лучше не писать в auth.php, а использовать метод save():




$auth=Yii::app()->authManager;

 

$auth->createOperation('createPost','создание записи');

...

$auth->save();



При этом если используется CPhpAuthManager, то права сохранятся в php файл, если CDbAuthManager - то в базу.

Приведенный код выполняется только один раз, при начальной инициализации ролей. Дальше для динамической настройки прав используется модифицированная версия расширения srbac.

[/quote ]

Где это прописывается (в каком файле)?

У Вас достаточно запутанная система ролей… Буду разбираться.

У меня начальная настройка ролей прописана в SiteController:




public function actionBuildAuth()

    {

        $auth=Yii::app()->authManager;

        $auth->clearAll();

        ... //создание операций и назначение существующим пользователям

        $auth->save();

    }



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

Понял - буду пробовать - спасибо!

я тоже за CdbAuthManager

Добрый день.

Если не сложно, поясните гофрированному.

Есть таблица ролей (операций), где прописано, какие операции какой роли доступны. У каждого юзера- своя роль.

Перед операцией делаем проверку: if(Yii::app()->user->checkAccess(‘createPost’)).

Вопрос: в чем смысл-

    // назначаем роли пользователям


    &#036;users = User::model()-&gt;findAll();


    foreach(&#036;users as &#036;user) {


        &#036;auth-&gt;assign(&#036;user-&gt;userType-&gt;name, &#036;user-&gt;id);


    }

Ведь роли (реально- практически всегда) присваиваются при регистрации юзера. И в соответствии с этой ролью и доступными операциями согласно таблицы (роли- операции) проверяется доступность? (см.выше)

В том посте кроме кода еще текст есть ))

Спасибо!

Будем "копать"

Здраствуйте все, кто откликнется:)

Собственно 1-й раз сел за Yii (да и вооббще за ООП). Вроде пока что все доступно, но не в случае с RBAC.

Есть гдето почитать литературы по этой теме? Или еще лучше примеры посмотреть, а то с примером до меня доходит раз в 10 быстрее чем с описанием :) И есть ли краткое описание самой структури приложения на Yii, а то по названиям папок смысл понятен, но нет конкретики:)

Вот прочитал этот материал

yiiframework.ru/doc/cookbook/ru/access.rbac.file - RBAC и описание ролей в файле - тут все хорошо написано, за исключением того, что используется файл, а не БД. Или если просто использовать CDbAuthManage, то все автоматом будет работать с БД?

И еще меня смущает смутное разделение на роли, задачи и операции. Если у меня в будущем будем магазин и в нем будут скидки для определенной группы (роли) пользователей, как мне элементарно связать таблицу скидок в БД с таблицей ролей? :blink: Если в той же таблице ролей хранятся и роль и задачи и операции…

Буду благодарен всем, кто поможет разобраться такому чайнику, как я ;D

Ответьте или сюда или на почту kyvour@gmail.com