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',
            //...
        ],
    ],

Comments are closed.