2012-01-18 42 views
1

我正在使用yi 1.1应用程序开发菜谱,并试图实现RBAC(基于角色的访问控制)。我得到的错误说CDbAuthManager没有被定义,这很奇怪,因为我测试了数据库连接并且工作正常,并且我在main.php配置文件中定义了数据库。下面是代码main.php:如何调试此错误:属性“CDbAuthManager.connectionId”未定义

// 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>"; 
     } 

} 

?> 

我的印象是,使用authManager的数据库版本时,“阶级” => 'CDbAuthManager',设置层次结构的唯一方法是通过yiic。但是它没有在书中提到yiic,只是说“现在运行init来创建RBAC层次结构”。对我来说,这意味着输入控制器/操作对像这样的网址: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没有定义,但我已经定义它,并将其设置为有效的数据库连接。它如何不被定义?

回答

2

我承认这个错误有点含糊。这实际上是相反的问题。你试图设置connectionId,并且错误告诉你它不能这么做,因为connectionId不是CDbAuthManager中的有效属性。我相信它其实是:

'connectionID' => 'db', 

'd'也必须大写。

我希望有帮助,这不是最清楚的错误信息。

相关问题