RBAC роли

Всем привет!)

Пару дней назад свалил с ZendFramework на Yii, ожидая прирост производительности.

То, что хотел я получил…но как и всегда…возникает много вопросов.

С английским у меня не очень.

Очень нужная дока про роли…ещё не до конца переведена((

http://www.yiiframew…/ru/topics.auth

При попытки расписать роли для задач и опираций возникает такая вот ошибка:

"CDbCommand failed to execute the SQL statement: SQLSTATE[42P01]: Undefined table: 7 ERROR: relation "authitem" does not exist"

Код из доки:



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


 


$auth->createOperation('createPost','create a post');


$auth->createOperation('readPost','read a post');


$auth->createOperation('updatePost','update a post');


$auth->createOperation('deletePost','delete a post');


 


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


$task=$auth->createTask('updateOwnPost','update a post by author himself',$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');


В конфиге стоит



'authManager'	=> array(


			'class'				=> 'CDbAuthManager',


			'connectionID'		=> 'db',


		),


Посмотрел код фреймворка в местах вызова функций, где возникает ошибка…

Ну зачем ему писать эти данные в бд?При каждом выполнении писать будем?

Очень интересно…

Помогите найти решение…если реально хранить все роли и права в БД…то это только лучше…я на зенде их так и хранил…

Заранее спасибо. :)

Не верю, что из 10ти просмотревших топик никто не знает решения =)

у тебя в базе таблицы не созданы для CDbAuthManager.

конкретно ошибка тебе говорит, что у тебя в базе нет таблицы authitem

Тебе нужно прочитать http://www.yiiframew…/CDbAuthManager

и выполнить в базе вот этот код framework/web/auth/schema.sql

Quote

у тебя в базе таблицы не созданы для CDbAuthManager.

конкретно ошибка тебе говорит, что у тебя в базе нет таблицы authitem

Тебе нужно прочитать http://www.yiiframew…/CDbAuthManager

и выполнить в базе вот этот код framework/web/auth/schema.sql

И всёже…не пойму…зачем база, если я статично всё хочу прописать)

Ща попробую, спасибо за ответ =)

Тоесть, как я понимаю, код, который у меня не работал использовался для записи данных о ролях и т.п. в БД, для того, чтобы в дальнейшем просто проверять всё это при помощи Yii::app()->user->checkAccess()?Я верно всё понял?

Quote

Quote

у тебя в базе таблицы не созданы для CDbAuthManager.

конкретно ошибка тебе говорит, что у тебя в базе нет таблицы authitem

Тебе нужно прочитать http://www.yiiframew…/CDbAuthManager

и выполнить в базе вот этот код framework/web/auth/schema.sql

И всёже…не пойму…зачем база, если я статично всё хочу прописать)

Ща попробую, спасибо за ответ =)

Понимаешь если БД ты не хочеш использовать - надо к классу CPhpAuthManager обращятся в конфиге а не к CDbAuthManager. т.к. ты вызываешь класс который заточен под работу с БД - то оно и требует таблицу для себя

Quote

link=topic=2285.msg12726#msg12726 date=1243127951]

Quote

Quote

у тебя в базе таблицы не созданы для CDbAuthManager.

конкретно ошибка тебе говорит, что у тебя в базе нет таблицы authitem

Тебе нужно прочитать http://www.yiiframew…/CDbAuthManager

и выполнить в базе вот этот код framework/web/auth/schema.sql

И всёже…не пойму…зачем база, если я статично всё хочу прописать)

Ща попробую, спасибо за ответ =)

Понимаешь если БД ты не хочеш использовать - надо к классу CPhpAuthManager обращятся в конфиге а не к CDbAuthManager. т.к. ты вызываешь класс который заточен под работу с БД - то оно и требует таблицу для себя

Ясненько)…прошу прощения за свои тупки))))

А я вот что-то не уловил, в каком месте этот код должен исполняться? Судя по всему, он может исполняться только один раз.

И еще вопрос. В коде, приведенном выше, роли назначаются вот таким макаром:

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


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


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


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

То есть, по сути, каждому пользователю персонально.

А как можно реализовать разделение ролей просто с использованием дополнительного поля в модели пользователя?

  1. Действительно, только один раз. Но это пример из доки. Вообще-то ты должен сделать админку, в которой подобные строчки будыт выпоняться когда юзер выбрал пользователя и выбрал роль.

  2. Нельзя, раве что ты сам напишешь такой вариант для RBAC. Посмотри код класса CDbAuthManager, может это и реально

Да, я уже понял, что придется адаптировать исходники базовых классов.

С вызовом assign разобрался.

Но это с БД. А как быть если ПХП-скрипт? В доках написано, что скрипт должен лежать в protected/data/auth.php. А что должно быть в скрипте?

Quote

2) Нельзя, раве что ты сам напишешь такой вариант для RBAC. Посмотри код класса CDbAuthManager, может это и реально

а почему нельзя??? а думаю что можно добавить аттрибут role, для пользователя, который будет содержать одну из ролей,созданную authManager-ом а потом переопределить метод getId у CWebUser - что бы он возвращал эту роль - это делается так как в методе checkAccess у CWebUser, используется именно getId()!

Кто-нибудь пробывал так поступать?? Какие возникали проблемы??