yiiアプリのログインプロセスに問題があります。サイトと顧客を管理する管理者ユーザーを含む2種類のユーザーがいます。私はこれら2つのグループのログインを使用CwebUser
して管理しています。UserIdentitiy
しかし、私の問題は、顧客がサイトにログインすると、管理ページにもアクセスできることです。私がやりたいのは、アプリケーションが2つの異なるIDセッションを作成するように言うことです。アクセス制御ルールのようなものは使いたくありません。Yiiスタイルで彼らのために異なるセッションを作成する方法はありますか?
3 に答える
コメントの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つの独立したユーザーコンポーネントができました:user
とadminUser
。AdminLoginForm
別のものを作成する必要があり、認証を行うため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つの異なるセクションにログインできます。
はいあります。ログインページが2つある場合は、2つのCUserIdentity
サブクラスを簡単に使用できます。その場合、認証プロセスは大きく異なる可能性があります。
ログインページを両方のユーザーセットで同じにする必要がある場合は、もう少し複雑になります。しかし、それは実行可能でなければなりません。
私が問題を解決した方法は、@ michaelソリューションのようなものですが、いくつかの違いがあります。設定ファイルで2つの異なるユーザーコンポーネントを定義しました:user
とcustomer
:
'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,
),
顧客のために、私はCWebUser
namedからの拡張クラスに逆らいましたNWebUser
。それはただの空のクラスです。それらに加えて、顧客認証メソッドを定義した UserIdentity
Callsを拡張する別のクラスを定義しました。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;
}