1

最初の RBAC システムを実装しようとしています。

私はこの部分に到達しています:

公式ドキュメントには、ユーザー名の例があります。

$auth->assign('adminRole', 'userA'); 
$auth->assign('adminRole', 'userB');

ただし、私の場合、代わりに ID が機能することがわかりました。

$auth->assign('adminRole', '8'); 
$auth->assign('adminRole', '9');

ユーザー名ではなく ID が機能したのはなぜですか? どこかでgetId()からのメソッドを上書きしたためだと推測しましたUserIdentity

しかし、ドキュメンテーションとYiiコードを読み続けた後、assign()メソッドが の子を受け入れず、代わりにインターフェースをCUserIdentity使用していることに気付きました。IWebUser

次に、メソッドに次のようなものがあるCWebUserことに気付きました。getId()

/**
     * Returns a value that uniquely represents the user.
     * @return mixed the unique identifier for the user. If null, it means the user is a guest.
     */
    public function getId()
    {
        return $this->getState('__id');
    }

私はこれを追い続けていますが、最終的$_SESSION[$key]には混乱しています。

それは何のidですか?ユーザーデータベーステーブルの主キーだと思います。

しかし、CWebUser はどのようにして私のユーザー データベース テーブル (と呼ばれるtbl_site_user) を知っているのでしょうか。

私が持っている唯一の構成はユーザーに関連しており、承認は私のメイン構成ファイルで次のとおりです。

'authManager'=>array(
            'class'=>'CDbAuthManager',
            'connectionID'=>'db',
        ), 

Yii は$auth->assign 2 番目の引数の ID をどこで取得しましたか?

4

1 に答える 1

1

コードのある時点で、おそらく を使用してCWebUser::login()Yii::app()->user->login($identity);を呼び出します。

public function login($identity,$duration=0)
{
    $id=$identity->getId();
    $states=$identity->getPersistentStates();
    if($this->beforeLogin($id,$states,false))
    {
        $this->changeIdentity($id,$identity->getName(),$states);
...

このメソッドは CUserIdentity オブジェクトを受け入れ、そこから ID を抽出し、CWebUser::changeIdentity()を呼び出します。

protected function changeIdentity($id,$name,$states)
{
    Yii::app()->getSession()->regenerateID(true);
    $this->setId($id);
    $this->setName($name);
    $this->loadIdentityStates($states);
}

CWebUser ::setId()が呼び出される場所。

public function setId($value)
{
    $this->setState('__id',$value);
}

__idセッション状態を設定します。

于 2014-09-10T00:17:51.933 に答える