检查用户是否登录,并将未登录用户重定向到登录页面
对后台系统来说,判断用户是否登录通常是定义在全局范围内的,一般的做法是判断 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
已经定义了访问控制逻辑,因此该逻辑将自动应用于子控制器的所有操作方法。