1

私はmongodbauthmanagerでこれをやろうとしています。セクションごとに順を追って説明してUsageいますが、最終的にPHP の警告が表示されます: Illegal offset type。SO にクローンする前に、 Yii Extensionにこの質問を投稿しました。

何が悪いのか教えてください。

1// 構成

 'authManager'=>array(
    'class'         =>'CMongoDbAuthManager',
    'showErrors'    => true,
  ),

2// db に認証項目を作成する

$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()れますcheckAccess)

//use _id as string, not MongoId object
$bizRule = 'return Yii::app()->user->id==(string)$params["User"]->_id;';

3// そしてユーザー checkAccess への認可

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

4

1 に答える 1

2

まず、元の の使用checkAccessは正しかったです。あなたを使用Yii::app()->user->checkAccess()すると、次の定義を使用しています。

http://www.yiiframework.com/doc/api/1.1/CWebUser#checkAccess-detail

ここで、callsCWebUserの実装の実装を行います。ここで、不正なオフセット タイプに関する問題が発生しました。checkAccessCPHPAuthManager

http://www.yiiframework.com/doc/api/1.1/CPhpAuthManager#checkAccess-detail

Illegal offset typeは、キーとして機能しない値でキー (オフセットとも呼ばれます) を指定して、配列要素にアクセスしようとしていることを意味します。これは、別の配列、オブジェクト、null、またはその他のものである可能性があります。

拡張機能ページに投稿されたスタック トレースは、次の行で問題が発生していることを示しています。

if(isset($this->_assignments[$userId][$itemName]))

したがって、不正なオフセットには と の 2 つの可能性が$userIdあり$itemNameます。

は明らかに文字列であるため$itemName、問題は にあるはず$userIdです。

(補足として、スタック トレースがこのエラーの周囲のコードを明らかにしたという事実は、少なくとも についてCPHPAuthManagerは、1.1.11 より前のバージョンの Yii を使用していることも明らかにしました。 https: //github.com/yiisoft/yii/blob/1.1.11/framework/web/auth/CPhpAuthManager.phpがファイルのコードに存在しません。)

Yii::app()->user->idこの時点で、問題は指定されたユーザーがログインしていないことであり、null. Yii::app()->user->idただし、の 2 番目のパラメーターとして配置するときに発生した新しいエラーは、他のcheckAccess何かを明らかにします。

$params2番目のパラメーターは実際には、に表示される配列であるべきものであるためbizRule. エラー メッセージに基づいて、これは が型オブジェクトYii::app()->user->idを返していることを意味します。mondoId

私はこのタイプのオブジェクトに慣れていなかったので、調べました:

http://php.net/manual/en/class.mongoid.php

簡単に言うと、このオブジェクトYii::app()->user->idに相当する文字列値を強制的に返す必要があります。mondoIdこれは、フォルダー内のUserIdentityクラスで設定される可能性があります。components強制的に文字列にするには、単純(string)に型変換を強制します。

例:

$this->_id = (string)$User->_id;

正確なコードは、UserIdentityクラスの内容によって異なります。

checkAccess次に、以前の署名に復元すると、Illegal offset error最初に遭遇した が削除されます。

ただし、私はこの拡張機能を使用していないことに注意してください。次のアクションを実行するとこの問題は解決しますが、拡張機能が文字列ではなくオブジェクトでYii::app()->user->idあるという事実に依存している場合、新しい問題が発生する可能性があります。mondoId

于 2013-04-08T08:46:40.497 に答える