Как я могу отладить эту ошибку: свойство "CDbAuthManager.connectionId" не определено - PullRequest
1 голос
/ 18 января 2012

Я использую поваренную книгу по разработке приложений 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 не определен, и все же я определил его и установил для него действительное соединение с БД.Как это НЕ может быть определено?

1 Ответ

2 голосов
/ 18 января 2012

Я допускаю, что эта ошибка немного расплывчата. Это на самом деле противоположный вопрос. Вы пытаетесь установить connectionId, и ошибка говорит вам, что он не может этого сделать, потому что connectionId не является допустимым свойством в CDbAuthManager. Я считаю, что это на самом деле:

'connectionID' => 'db',

'd' также должно быть написано заглавными буквами.

Надеюсь, это поможет, это действительно не самое понятное сообщение об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...