Yii2 框架 - 判断用户是否登录

96 阅读1分钟

检查用户是否登录,并将未登录用户重定向到登录页面

对后台系统来说,判断用户是否登录通常是定义在全局范围内的,一般的做法是判断 Yii::$app->user->isGuest 的值是否为true来进行重定向处理,比如

class HomeController extends Controller {
    
    public function actionIndex() {
        if(Yii::$app->user->isGuest) {
            return $this->redirect(['site/login']);
        }
    }
}

但是我们总不能在每个控制器里面都添加这几行代码,维护起来麻烦不说,写起来也是很累人的。

比较推荐的做法是定义一个基类,在基类的behaviors()方法中处理

基类控制器

namespace app\controllers;


use yii\filters\AccessControl;
use yii\web\Controller;

class BaseController extends Controller
{
    public function behaviors() {
        return [
            'access' => [
                'class' => AccessControl::class,
                'rules' => [
                    [
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                    // 以下规则等同
                    //[
                    //    'allow' => false,
                    //    'roles' => ['?']
                    //]
                ],
                'except' => ['login'], // 别遗漏了这一行,否则浏览器将会无限次进行重定向
                'denyCallback' => function($rule, $action) {
                    return $this->redirect(['site/login']);
                }
            ]
        ];
    }
}

上述代码中使用了Yii2内置的AccessControl过滤器来添加访问控制逻辑,这使得代码更加清晰和易于维护。

rules中的allow代表这是一条允许规则,roles@代表已登录的用户,未登录用户使用?表示,except表示排除的方法,denyCallback定义rules验证失败的回调。

实际使用中,只需要修改其它控制器都继承该基类即可,由于BaseController已经定义了访问控制逻辑,因此该逻辑将自动应用于子控制器的所有操作方法。