我正在尝试使用mongodbauthmanager来做到这一点。我在Usage
部分中一步一步地进行操作,但最后我收到了PHP 警告:非法偏移类型。在克隆到 SO 之前,我已经在Yii Extension上发布了这个问题:
请告诉我有什么问题吗?
1// 配置
'authManager'=>array(
'class' =>'CMongoDbAuthManager',
'showErrors' => true,
),
2// 在数据库中创建身份验证项
$auth = new CMongoDbAuthManager();
$bizRule = 'return Yii::app()->user->id==$params["User"]->_id;';
$auth->createTask('updateSelf', 'update own information', $bizRule);
//I had tried with $auth->createOperation() but they has the same error
$role = $auth->createRole('user');
$role->addChild('updateSelf');
$auth->save();
这里是 db 结果在 db http://i.minus.com/iIpXoBlDxaEfo.png
**3// 检查控制器中的访问权限** -更新代码和错误
public function actionUpdate($id)
{
$model=$this->loadModel($id);
$params = array('User'=>$model);
if (!Yii::app()->user->checkAccess('updateSelf', Yii::app()->user->id,$params) )
{
throw new CHttpException(403, 'You are not authorized to perform this action');
}
//another statement ...
}
4// 得到错误:
致命错误:无法将 MongoId 类型的对象用作 F:\Data\03 中的数组。Lab\www\yii\framework\web\auth\CAuthManager.php(150) :第 1 行的 eval()代码
已解决的问题
基于 的答案@Willem Renzema
,我解决了我的问题。现在,我在这里更新并希望它对遇到此错误的人有用。
0// 首先,使用 defaultRoles 配置 authManager
'authManager'=>array(
'class'=>'CMongoDbAuthManager',
'showErrors' => true,
'defaultRoles'=> array('user'),//important, this line help we don't need assign role for every user manually
),
1// 修复 UserIdentity 类中的保存 id
class UserIdentity extends CUserIdentity
{
private $_id;
//...
public function authenticate()
{
//...
$this->_id = (string)$user->_id;//force $this save _id by string, not MongoId object
//...
}
//...
}
2// 修复授权项目中的
$bizrule($bizrule 将在eval()
in 中运行checkAccess
)
//use _id as string, not MongoId object
$bizRule = 'return Yii::app()->user->id==(string)$params["User"]->_id;';
3//和用户检查访问权限
public function actionUpdate($id){
/**
* @var User $model
*/
$model=$this->loadModel($id);
$params = array('User'=>$model);
if (!Yii::app()->user->checkAccess('updateSelf', $params) )
{
throw new CHttpException(403, 'You are not authorized to perform this action');
}
//...
}
4// 完成,现在我们可以使用 checkAccess :D