Yii2 前后台登陆退出分离、登陆验证

时间: 2017-03-20  分类: Yii2  收藏
这里用的yii2高级模板, 基本模板的配置文件在一个文件里,方法基本没什么区别,

1.用户表
要有两个用户表, 当然一个也行,分开是省得麻烦,既然是分离了就彻底分开, 前台表user,后台表user_backend,表结构这里不再说明了,只列出字段

id username auth_key password_hash password_reset_token email status created_at updated_at


2.配置文件
分别将frontend/config/main.php和backend/config/main.php里增加如下代码中user部分内容,注意放在配置文件components参数之内,有user部分的修改即可
要特别注意下 identityCookie和 idParam 参数, 前后台要不一样
//前台配置项
return [
    'id' => 'app-frontend',
    'basePath' => dirname(__DIR__),
    .......省略代码
    'components' => [
        'user' => [
            'identityClass' => 'frontend\models\User', //前台用户验证类
            'enableAutoLogin' => true,
            'identityCookie' => ['name' => '_identity-frontend', 'httpOnly' => true],
            'loginUrl' => ['site/login'],
            'idParam' => '__user',
        ],
        .......省略代码
    ],

//后台配置项
'user' => [
    'identityClass' => 'backend\models\UserBackend', //后台用户验证类
    'enableAutoLogin' => true,
    'identityCookie' => ['name' => '_identity-backend', 'httpOnly' => true],
    'loginUrl' => ['site/login'],
    'idParam' => '__admin',
],

3.控制器登陆退出
这里只列出前台控制器代码,后台是一样的,
//登陆
public function actionLogin() {
    if (!Yii::$app->user->isGuest) {
        return $this->goHome();
    }
    $model = new LoginForm();
    if($model->load(Yii::$app->request->post()) && $model->login()) {
        return $this->goBack();
    } else {
        return $this->render('login', [
            'model' => $model,
        ]);
    }
}
//退出
public function actionLogout() {
    Yii::$app->user->logout();
    return $this->goHome();
}

4.模型Model
同样只列出前台部分,后台基本相同, 如下代码getUser()中User::findByUsername使用的为frontend\models\User类的方法, 此类直接使用common\models\User改命名空间即可,
class LoginForm extends Model {
    ....省略代码
    public function login() {
        $user = $this->getUser();
        if($this->validate()) {
            return Yii::$app->user->login($user, $this->rememberMe ? 3600 * 24 * 30 : 0);
        } else {
            return false;
        }
    }

    protected function getUser() {
        if ($this->_user === null) {
            $this->_user = User::findByUsername($this->username);
        }
        return $this->_user;
    }
    ....省略代码
}
注意 models\User表名部分, 前台使用的是user 后台使用的是user_backend

public static function tableName() {
    return '`i_user`'; //后台为user_backend
}


模板view部分使用自带的即可, 这样前后台登陆退出互不影响,彻底分离,我在网上看到有说修改入口文件的,入口文件除前两行可改,其它都不要动为好.
分享到:

评论

昵 称:
游客37643
最好的测试方法是用浏览器工具,比如火狐的firebug,打开控制台功能, 然后重复你的操作, 看看400的错误时,提示什么
05-15 22:23
游客26152
正常的退出登陆是可以了 但是有个问题 我在多次测试  前台登陆->后台登陆->前台退出 相互交叉着登陆退出的时候会出现400错误
05-04 11:30