0

yiiアプリのログインプロセスに問題があります。サイトと顧客を管理する管理者ユーザーを含む2種類のユーザーがいます。私はこれら2つのグループのログインを使用CwebUserして管理しています。UserIdentitiyしかし、私の問題は、顧客がサイトにログインすると、管理ページにもアクセスできることです。私がやりたいのは、アプリケーションが2つの異なるIDセッションを作成するように言うことです。アクセス制御ルールのようなものは使いたくありません。Yiiスタイルで彼らのために異なるセッションを作成する方法はありますか?

4

3 に答える 3

8

コメントの1つで提案されているような複雑なRBACセットアップを使用したくない場合は、異なる2つのユーザーコンポーネントを構成することでこれを実現できますstateKeyPrefix

'user' => array(              // Webuser for the frontend
    'class'             => 'CWebUser',
    'loginUrl'          => array('site/login'),
    'stateKeyPrefix'    => 'frontend_',
),
'adminUser' => array(         // Webuser for the admin area (admin)
    'class'             => 'CWebUser',
    'loginUrl'          => array('/admin/site/login'),
    'stateKeyPrefix'    => 'admin_',
),

これで、2つの独立したユーザーコンポーネントができました:useradminUserAdminLoginForm別のものを作成する必要があり、認証を行うためAdminUserIdentityに使用します。/admin/site/loginこれは簡単なはずです。

accessRulesまだ問題がありますが、管理モジュールで簡単に定義することはできません。これは、userコンポーネントを使用して承認チェックを実行するのに対し、adminUserコンポーネントを使用するためです。AdminModuleこれを解決するには、次のようにコンポーネント構成を変更できます。

class AdminModule extends CWebModule
{
    public function beforeControllerAction($controller, $action)
    {
        if(parent::beforeControllerAction($controller,$action))
        {
            // Make 'adminUser' the main user in this module.
            // Frontend user is available as 'Yii::app()->frontendUser'.
            Yii::app()->setComponent('frontendUser', Yii::app()->user);
            Yii::app()->setComponent('user', Yii::app()->adminUser);
            return true;
        }
        else
            return false;
    }
}

これで、認証に異なるユーザーベースを使用して、サイトの2つの異なるセクションにログインできます。

于 2013-03-16T09:56:44.550 に答える
0

はいあります。ログインページが2つある場合は、2つのCUserIdentityサブクラスを簡単に使用できます。その場合、認証プロセスは大きく異なる可能性があります。

ログインページを両方のユーザーセットで同じにする必要がある場合は、もう少し複雑になります。しかし、それは実行可能でなければなりません。

于 2013-03-15T23:28:08.363 に答える
0

私が問題を解決した方法は、@ michaelソリューションのようなものですが、いくつかの違いがあります。設定ファイルで2つの異なるユーザーコンポーネントを定義しました:usercustomer

 'user' => array(
            'loginUrl' => '/admin/default/login',
            // enable cookie-based authentication
            'allowAutoLogin' => true,
        ),
        'customer' => array(
            'class' => 'NWebUser',
            'loginUrl' => '/customer/signIn',
            // enable cookie-based authentication
            'allowAutoLogin' => true,
        ),

顧客のために、私はCWebUsernamedからの拡張クラスに逆らいましたNWebUser。それはただの空のクラスです。それらに加えて、顧客認証メソッドを定義した UserIdentityCallsを拡張する別のクラスを定義しました。CustomerIdentity

class CustomerIdentity extends CUserIdentity {

    private $_id;

    public function authenticate() {
        $record = Customer::model()->findByAttributes(array('email' => $this->username));
        if ($record === null) {
            $this->errorCode = self::ERROR_USERNAME_INVALID;
        } else if ($record->password !== Customer::hashPassword($this->password)) {
            $this->errorCode = self::ERROR_PASSWORD_INVALID;
        } else {
            $this->_id = $record->id;
            $this->errorCode = self::ERROR_NONE;
        }
        return !$this->errorCode;
    }

    public function getId() {
        return $this->_id;
    }

}

ログインメソッドでは、次のCustomerIdentityクラスを使用します。

public function login() {
        if ($this->_identity === null) {
            $this->_identity = new CustomerIdentity($this->username, $this->password);
            $this->_identity->authenticate();
        }
        if ($this->_identity->errorCode === CustomerIdentity::ERROR_NONE) {
            $duration = $this->rememberMe ? 3600 * 24 * 30 : 0; // 30 days
            Yii::app()->customer->login($this->_identity, $duration);
            return true;
        }
        else
            return false;
    }
于 2013-03-16T15:26:20.997 に答える