как должен выглядеть настоящий auth.php у меня счас Undefined index: bizRule
#1
Posted 11 August 2009 - 04:49 PM
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',
),
),
как бизнесправила описывать если их хранить в файле?
#2
Posted 12 August 2009 - 02:53 AM
maks, on 11 August 2009 - 04:49 PM, said:
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',
),
...
),
#3
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' будет выполнятся условие?
#5
Posted 12 August 2009 - 06:32 AM
#6
Posted 12 August 2009 - 08:28 AM
maks, 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' сможет редактировать пост, если является его автором.
#8
Posted 09 October 2009 - 04:41 AM
Твой первый биллинг #02 : Обзор 14/01/2010
Стабильная версия Yii Framework 1.1 11/01/2010
#9
Posted 21 October 2009 - 05:41 AM
breakeneck, on 02 October 2009 - 04:43 AM, said:
Из документации:
Проверка доступа
Для проверки доступа нам необходимо знать имя элемента авторизации. К примеру, чтобы проверить, может ли текущий пользователь создать запись, необходимо узнать, имеет ли он права, описанные операцией 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('*'),
),
);
}
#10
Posted 20 November 2009 - 12:25 PM
#11
Posted 28 November 2009 - 05:45 AM
такой "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", а как там прописывать права и обязанности?
#12
Posted 01 December 2009 - 10:31 AM
Rsol, on 28 November 2009 - 05:45 AM, said:
такой "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('*'),
),
);
}
#13
Posted 01 December 2009 - 02:13 PM
[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]
У Вас достаточно запутанная система ролей... Буду разбираться.
#14
Posted 02 December 2009 - 01:55 AM
Rsol, on 01 December 2009 - 02:13 PM, said:
У меня начальная настройка ролей прописана в SiteController:
public function actionBuildAuth()
{
$auth=Yii::app()->authManager;
$auth->clearAll();
... //создание операций и назначение существующим пользователям
$auth->save();
}
Этот метод я вызываю только один раз - при первоначальной настройке, чтобы создать нужный набор операций и ролей.
#15
Posted 03 December 2009 - 09:44 AM
seb, on 02 December 2009 - 01:55 AM, said:
public function actionBuildAuth()
{
$auth=Yii::app()->authManager;
$auth->clearAll();
... //создание операций и назначение существующим пользователям
$auth->save();
}
Этот метод я вызываю только один раз - при первоначальной настройке, чтобы создать нужный набор операций и ролей.
Понял - буду пробовать - спасибо!
#17
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);
}
Ведь роли (реально- практически всегда) присваиваются при регистрации юзера. И в соответствии с этой ролью и доступными операциями согласно таблицы (роли- операции) проверяется доступность? (см.выше)
#18
Posted 20 April 2012 - 04:56 AM
Shlang, 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
#20
Posted 01 February 2013 - 10:24 AM
Собственно 1-й раз сел за Yii (да и вооббще за ООП). Вроде пока что все доступно, но не в случае с RBAC.
Есть гдето почитать литературы по этой теме? Или еще лучше примеры посмотреть, а то с примером до меня доходит раз в 10 быстрее чем с описанием
Вот прочитал этот материал
yiiframework.ru/doc/cookbook/ru/access.rbac.file - RBAC и описание ролей в файле - тут все хорошо написано, за исключением того, что используется файл, а не БД. Или если просто использовать CDbAuthManage, то все автоматом будет работать с БД?
И еще меня смущает смутное разделение на роли, задачи и операции. Если у меня в будущем будем магазин и в нем будут скидки для определенной группы (роли) пользователей, как мне элементарно связать таблицу скидок в БД с таблицей ролей?
Буду благодарен всем, кто поможет разобраться такому чайнику, как я
Ответьте или сюда или на почту kyvour@gmail.com

Help
















