預設單一 CWebUser 實例會導致前後台登入狀態互相影響。解決方案:在後台模組初始化時註冊獨立的用戶組件,並設定不同的 Session 前綴。
'user' => array(
'class' => 'WebUser',
'stateKeyPrefix' => 'member',
'allowAutoLogin' => true,
),
class AdminModule extends CWebModule {
public function init() {
parent::init();
$this->setImport(array('admin.models.*', 'admin.components.*'));
Yii::app()->setComponents(array(
'errorHandler' => array('errorAction' => 'admin/default/error'),
'admin' => array(
'class' => 'AdminWebUser',
'stateKeyPrefix' => 'admin',
'loginUrl' => Yii::app()->createUrl('admin/default/login'),
),
), false);
}
public function beforeControllerAction($controller, $action) {
if (parent::beforeControllerAction($controller, $action)) {
$route = $controller->id . '/' . $action->id;
$public = array('default/login', 'default/error');
if (Yii::app()->admin->isGuest && !in_array($route, $public)) {
Yii::app()->admin->loginRequired();
}
return true;
}
return false;
}
}
// 前台 WebUser
class WebUser extends CWebUser {
public function __get($name) {
if ($this->hasState('__userInfo')) {
$user = $this->getState('__userInfo', array());
if (isset($user[$name])) return $user[$name];
}
return parent::__get($name);
}
public function login($identity, $duration) {
$this->setState('__userInfo', $identity->getUser());
parent::login($identity, $duration);
}
}
// 後台 AdminWebUser
class AdminWebUser extends CWebUser {
public function __get($name) {
if ($this->hasState('__adminInfo')) {
$user = $this->getState('__adminInfo', array());
if (isset($user[$name])) return $user[$name];
}
return parent::__get($name);
}
public function login($identity, $duration) {
$this->setState('__adminInfo', $identity->getUser());
parent::login($identity, $duration);
}
}
Yii::app()->user->logout(false); // 前台登出 Yii::app()->admin->logout(false); // 後台登出
logout(false) 只會清除對應 stateKeyPrefix 的 Session 變數,不影響另一端。
Yii::app()->userYii::app()->admin