Yii2 没有登录的页面全部转到登录页
方法一:写一个控制器基类,然后继承其init方法,然后做判断
class BaseController extends Controller { public function init() { /* 判断是否登录 */ if (\Yii::$app->user->isGuest) { $this->redirect(Url::toRoute('/site/login')); Yii::$app->end(); } } }
方法二:写一个控制器基类,然后使用behaviors认证
class BaseController extends Controller { /** * @return array */ public function behaviors() { return [ 'access' => [ 'class' => AccessControl::class, 'rules' => [ [ 'allow' => true, 'roles' => ['@'], // 登录 ], ], ], ]; } }
方法三:增加一个 控制器中间层, 在中间层用 beforeAction 做统一的过滤
class AccessControl extends \yii\base\ActionFilter { /** * 在程序执行之前,对访问的方法进行权限验证. * @param \yii\base\Action $action * @return bool * @throws ForbiddenHttpException */ public function beforeAction($action) { //如果未登录,则直接返回 if(Yii::$app->user->isGuest){ return Yii::$app->user->loginRequired(); } //获取路径 $path = Yii::$app->request->pathInfo; //忽略列表 if (in_array($path, $this->ignoreList)) { return true; } if (Yii::$app->user->can($path)) { return true; } else { throw new ForbiddenHttpException(Yii::t('app', 'message 401')); } }
main.php 配置 components:
'as access' => [ 'class' => backend\components\AccessControl::className(), 'allowActions' => [ 'site/login', 'site/captcha', //... ], ],