首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

Yii 前後台登入分離:使用獨立 CWebUser 實例與 Session 前綴

     編輯:PHP 綜合知識

解決前後台共用 CWebUser 導致同步登入登出問題

預設單一 CWebUser 實例會導致前後台登入狀態互相影響。解決方案:在後台模組初始化時註冊獨立的用戶組件,並設定不同的 Session 前綴。

1. 前台用戶組件配置

'user' => array(
    'class' => 'WebUser',
    'stateKeyPrefix' => 'member',
    'allowAutoLogin' => true,
),

2. 後台模組 AdminModule.php

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;
    }
}

3. 獨立 WebUser 類別

// 前台 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);
    }
}

4. 登出時僅銷毀當前實例 Session

Yii::app()->user->logout(false);   // 前台登出
Yii::app()->admin->logout(false);  // 後台登出

logout(false) 只會清除對應 stateKeyPrefix 的 Session 變數,不影響另一端。

5. 存取方式

  • 前台:Yii::app()->user
  • 後台:Yii::app()->admin
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved