Я использую поваренную книгу по разработке приложений yi 1.1 и пытаюсь реализовать RBAC (управление доступом на основе ролей).Получаемая ошибка говорит о том, что CDbAuthManager не определен, что странно, потому что я протестировал соединение db, и это работает, и я определяю db в моем файле конфигурации main.php.Вот код main.php:
// application components
'components'=>array(
'user'=>array(
// enable cookie-based authentication
'allowAutoLogin'=>true,
),
'db'=>array(
'connectionString' => 'mysql:host=localhost;dbname=rbac',
'emulatePrepare' => true,
'username' => 'root',
'password' => 'myPassword',
'charset' => 'utf8',
),
'authManager'=>array(
'class'=>'CDbAuthManager',
'connectionId'=>'db',
),
А вот файл RbacController.php:
<?php
class RbacController extends CController
{
public function filters()
{
return array(
'accessControl',
);
}
public function accessRules()
{
return array(
array(
'allow',
'actions'=>array('deletePost'),
'roles'=>array('deletePost'),
),
array(
'allow',
'actions'=>array('init', 'test'),
),
array('deny'),
);
}
public function actionInit()
{
$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('readPost');
$role->addChild('createPost');
$role->addChild('updateOwnPost');
$role=$auth->createRole('editor');
$role->addChild('readPost');
$role->addChild('createPost');
$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');
echo 'Done';
}
public function actionDeletePost()
{
echo "Post Deleted";
}
public function actionTest()
{
$post= new stdClass();
$post->authId = 'authorB';
echo "Current Permissions:<br />";
echo "<ul>";
echo "<li>Create post: ".Yii::app()->user->checkAccess('createPost')."</li>";
echo "<li>Read post: ".Yii::app()->user->checkAccess('readPost')."</li>";
echo "<li>Update post: ".Yii::app()->user->checkAccess('updatePost')."</li>";
echo "<li>Delete post: ".Yii::app()->user->checkAccess('deletePost')."</li>";
echo "</ul>";
}
}
?>
У меня сложилось впечатление, что при использовании db-версии authManager 'class '=>' CDbAuthManager ', единственный способ установить иерархию - через yiic.Но в книге ничего не говорится о yiic, просто говорится: «Теперь один раз запустите init, чтобы создать иерархию RBAC».Для меня это означает, что введите пару контроллер / действие в URL следующим образом: http://localhost/rbac/index.php?r=Rbac/init. IDK, возможно, именно здесь я ошибаюсь.Обыскал сеть и не смог найти проблем, схожих с этой.
Редактировать: Я просто попытался другой подход.на этот раз я создал команду консольного приложения в /Users/scottmcpherson/Sites/phpsites/rbac/protected/commands/shell/RbacCommand.php, и я получаю ту же ошибку при попытке запустить ее в терминале:
exception 'CException' with message 'Property "CDbAuthManager.connectionId" is not defined.' in /Users/scottmcpherson/Sites/phpsites/yiiRoot/framework/base/CComponent.php:174
Stack trace:
#0 /Users/scottmcpherson/Sites/phpsites/yiiRoot/framework/YiiBase.php(225): CComponent->__set('connectionId', 'db')
#1 /Users/scottmcpherson/Sites/phpsites/yiiRoot/framework/base/CModule.php(371): YiiBase::createComponent(Array)
#2 /Users/scottmcpherson/Sites/phpsites/yiiRoot/framework/base/CModule.php(86): CModule->getComponent('authManager')
#3 /Users/scottmcpherson/Sites/phpsites/rbac/protected/commands/shell/RbacCommand.php (24): CModule->__get('authManager')
#4 /Users/scottmcpherson/Sites/phpsites/yiiRoot/framework/cli/commands/ShellCommand.p hp(147): RbacCommand->run(Array)
#5 /Users/scottmcpherson/Sites/phpsites/yiiRoot/framework/cli/commands/ShellCommand.p hp(99): ShellCommand->runShell()
#6 /Users/scottmcpherson/Sites/phpsites/yiiRoot/framework/console/CConsoleCommandRunner.php(63): ShellCommand->run(Array)
#7 /Users/scottmcpherson/Sites/phpsites/yiiRoot/framework/console/CConsoleApplication .php(88): CConsoleCommandRunner->run(Array)
#8 /Users/scottmcpherson/Sites/phpsites/yiiRoot/framework/base/CApplication.php(158): CConsoleApplication->processRequest()
#9 /Users/scottmcpherson/Sites/phpsites/yiiRoot/framework/yiic.php(33): CApplication->run()
#10 /Users/scottmcpherson/Sites/phpsites/yiiRoot/framework/yiic(15): require_once('/Users/scottmcp...')
#11 {main}
В нем говорится, что connectionId не определен, и все же я определил его и установил для него действительное соединение с БД.Как это НЕ может быть определено?