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

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

как должен выглядеть настоящий auth.php у меня счас Undefined index: bizRule Rate Topic: -----

Poll: как должен выглядеть настоящий auth.php (57 member(s) have cast votes)

Первое или второе

  1. CDbAuthManager (43 votes [75.44%] - View)

    Percentage of vote: 75.44%

  2. CPhpAuthManager (14 votes [24.56%] - View)

    Percentage of vote: 24.56%

Vote Guests cannot vote

#1 User is offline   maks 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 14
  • Joined: 01-February 09

Posted 11 August 2009 - 04:49 PM

PHP Error
Description
Undefined index: bizRule
Source File
D:\WAPPStack\apache2\htdocs\framework\web\auth\CPhpAuthManager.php(450)


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

'admin' => array(
'type' => CAuthItem::TYPE_ROLE,
'description' => 'admin',
'children' => array(
'manager',
),
),


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

#2 User is offline   Demyan 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 33
  • Joined: 10-July 09
  • Location:Russian Federation

Posted 12 August 2009 - 02:53 AM

View Postmaks, on 11 August 2009 - 04:49 PM, said:

PHP Error
Description
Undefined index: bizRule
Source File
D:\WAPPStack\apache2\htdocs\framework\web\auth\CPhpAuthManager.php(450)


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

'admin' => array(
'type' => CAuthItem::TYPE_ROLE,
'description' => 'admin',
'children' => array(
'manager',
),
),


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


<?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',
            ),
    ...
),

0

#3 User is offline   maks 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 14
  • Joined: 01-February 09

Posted 12 August 2009 - 06:11 AM

  'admin' => 
  array (
    'type' => 2,
    'description' => '',
    'bizRule' => NULL,
    'data' => NULL,
    'assignments' => 
    array (
      1 => 
      array (
        'bizRule' => NULL,
        'data' => NULL,
      ),
    ),
  ),

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

#4 User is offline   samdark 

  • Having fun
  • Yii
  • Group: Yii Dev Team
  • Posts: 2,648
  • Joined: 17-January 09
  • Location:Russia

Posted 12 August 2009 - 06:15 AM

http://yiiframework....ccess.rbac.file
0

#5 User is offline   maks 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 14
  • Joined: 01-February 09

Posted 12 August 2009 - 06:32 AM

View Postsamdark, on 12 August 2009 - 06:15 AM, said:


да встречал ваш пост
но правила вы там не описываете как я поянл
0

#6 User is offline   Demyan 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 33
  • Joined: 10-July 09
  • Location:Russian Federation

Posted 12 August 2009 - 08:28 AM

View Postmaks, on 12 August 2009 - 06:11 AM, said:

  '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' сможет редактировать пост, если является его автором.
3

#7 User is offline   breakeneck 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 2
  • Joined: 12-August 09

Posted 02 October 2009 - 04:43 AM

View PostDemyan, on 12 August 2009 - 08:28 AM, said:


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



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

#8 User is offline   Zolter 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 377
  • Joined: 26-March 09

Posted 09 October 2009 - 04:41 AM

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

#9 User is offline   Demyan 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 33
  • Joined: 10-July 09
  • Location:Russian Federation

Posted 21 October 2009 - 05:41 AM

View Postbreakeneck, on 02 October 2009 - 04:43 AM, said:

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


Из документации:
Проверка доступа

Для проверки доступа нам необходимо знать имя элемента авторизации. К примеру, чтобы проверить, может ли текущий пользователь создать запись, необходимо узнать, имеет ли он права, описанные операцией 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('*'),
            ),
        );
    }

0

#10 User is offline   samdark 

  • Having fun
  • Yii
  • Group: Yii Dev Team
  • Posts: 2,648
  • Joined: 17-January 09
  • Location:Russia

Posted 20 November 2009 - 12:25 PM

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

#11 User is offline   Rsol 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 122
  • Joined: 29-May 09
  • Location:Severodonetsk [UA]

Posted 28 November 2009 - 05:45 AM

С 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", а как там прописывать права и обязанности?
0

#12 User is offline   seb 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 228
  • Joined: 29-June 09

Posted 01 December 2009 - 10:31 AM

View PostRsol, on 28 November 2009 - 05:45 AM, said:

С 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('*'),
            ),
        );
    }

0

#13 User is offline   Rsol 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 122
  • Joined: 29-May 09
  • Location:Severodonetsk [UA]

Posted 01 December 2009 - 02:13 PM

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

[quote name='seb' date='01 December 2009 - 05:31 PM' timestamp='1259681500' post='30145']

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

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

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

[/quote ]

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

[quote name='seb' date='01 December 2009 - 05:31 PM' timestamp='1259681500' post='30145']

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

[/quote]

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

#14 User is offline   seb 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 228
  • Joined: 29-June 09

Posted 02 December 2009 - 01:55 AM

View PostRsol, on 01 December 2009 - 02:13 PM, said:

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


У меня начальная настройка ролей прописана в SiteController:
public function actionBuildAuth()
    {
        $auth=Yii::app()->authManager;
        $auth->clearAll();
        ... //создание операций и назначение существующим пользователям
        $auth->save();
    }

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

#15 User is offline   Rsol 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 122
  • Joined: 29-May 09
  • Location:Severodonetsk [UA]

Posted 03 December 2009 - 09:44 AM

View Postseb, on 02 December 2009 - 01:55 AM, said:

У меня начальная настройка ролей прописана в SiteController:
public function actionBuildAuth()
    {
        $auth=Yii::app()->authManager;
        $auth->clearAll();
        ... //создание операций и назначение существующим пользователям
        $auth->save();
    }

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


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

#16 User is offline   zaccaria 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 2,159
  • Joined: 04-October 09
  • Location:Moscow

Posted 02 June 2011 - 02:20 AM

я тоже за CdbAuthManager
0

#17 User is offline   Shlang 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 5
  • Joined: 26-March 12

Posted 19 April 2012 - 02:53 AM

Добрый день.
Если не сложно, поясните гофрированному.

Есть таблица ролей (операций), где прописано, какие операции какой роли доступны. У каждого юзера- своя роль.
Перед операцией делаем проверку: if(Yii::app()->user->checkAccess('createPost')).

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

// назначаем роли пользователям
$users = User::model()->findAll();
foreach($users as $user) {
$auth->assign($user->userType->name, $user->id);
}

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

#18 User is offline   seb 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 228
  • Joined: 29-June 09

Posted 20 April 2012 - 04:56 AM

View PostShlang, on 19 April 2012 - 02:53 AM, said:

Добрый день.
Если не сложно, поясните гофрированному.

Есть таблица ролей (операций), где прописано, какие операции какой роли доступны. У каждого юзера- своя роль.
Перед операцией делаем проверку: if(Yii::app()->user->checkAccess('createPost')).

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

// назначаем роли пользователям
$users = User::model()->findAll();
foreach($users as $user) {
$auth->assign($user->userType->name, $user->id);
}

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


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

Quote

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

0

#19 User is offline   Shlang 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 5
  • Joined: 26-March 12

Posted 30 April 2012 - 11:37 AM

Спасибо!

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

#20 User is offline   kyvour 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 1
  • Joined: 01-February 13

Posted 01 February 2013 - 10:24 AM

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

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

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

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

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

Буду благодарен всем, кто поможет разобраться такому чайнику, как я ;D
Ответьте или сюда или на почту kyvour@gmail.com
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users