0

ユーザーの検証に RBAC は使用しません。可能であれば使っても構わないと思いますが、そうではないと思います。その理由は、REST API を使用してユーザーを検証するためです。私はこれを私のauthenticate()関数に持っています:

$API = new API();
$user = $API->getAccountDetailsByEmail($this->username);
if($user->password !== md5($this->password) ) {
   // Validated
}

このステップで、ユーザーにもロールを割り当てたいと思います。そのため、上記の下に次のことを試しました。

$this->setState('roles', 'admin'); 

しかし、これはまったく機能しません。私はまだ得る:

Error 403: You are not authorized to perform this action.

ページに移動すると、管理者にアクセスできるようにしようとしています。プログラムでユーザーを管理者として設定するにはどうすればよいですか?

何か不足していますか、または認証されたユーザーに役割を割り当てる簡単な方法はありますか?

4

2 に答える 2

1

CAccessControlFilter は、CWebUser::checkAccess() 関数に依存しています。この関数は、ロールの名前をパラメータとして呼び出されます。RBAC が必要ない場合、最も簡単な方法は、独自の CWebUser 派生クラスを作成し、独自の checkAccess を実装することです。

「user」コンポーネントを追加することにより、構成ファイルでこのクラスをアクティブ化できます。

'components'=> array
(
    'user' => array
    (
        'class' => 'MyWebUser',
    ),
),

たとえば、ユーザーのセッションでロールのリストを設定し、ユーザーがそのロールを持っているかどうかを関数にチェックさせることができます。セッションを使用してロールを保存することはお勧めしませんが (データベースの方が優れています)、setState を使用することは間違いなく悪い考えです。IIRC これにより、ユーザー側に Cookie が設定され、少し独創的なユーザーはこれを悪用する方法を理解できます。

于 2012-11-26T08:56:05.400 に答える
0

あなたのアクションルールが

array('allow', 
  'actions'=>array(
    'myAction',
  ),
  'users'=>array('@'),
  'roles'=>array('admin'),
),

次に、それらを次のように変更します。

array('allow', 
  'actions'=>array(
    'myAction',
  ),
  'users'=>array('@'),
  'expression'=>'$user->getState("roles")=="admin"',
),

アクション ルールのロール パラメータは、RBAC でのみ使用できます。したがって、RBAC を使用していない場合は、別の方法で検証を行う必要があります。

それが問題でない場合は、何をしようとしているのか、アクセス ルールがどのように見えるのか、詳細をお知らせください。

于 2012-11-25T18:28:13.783 に答える