Yii2 Yii::$app->user->identity->id 返回错误而不是重定向到登录页面



在我的行为中,我指定actionList只能由经过身份验证的用户查看。

$behaviors [ 'access' ] = [
    'class' => AccessControl::className(),
    'rules' => [
        [
            'actions' => [ 'list' ],
            'allow'   => ['@'],
        ]
    ],
];

actionList中,我得到了user_id:

public function actionList() {
    $user_id  = Yii::$app->user->identity->id;
    return $this->render( 'list' );
}

一切都很好,但如果你在未登录时执行此操作,你会收到一个错误:

PHP通知–yii\base\ErrorException

正在尝试获取非对象的属性

有道理,我没有登录,所以我没有用户id,但为什么代码会走那么远?如果我把$user_id = Yii::$app->user->identity->id;注释掉,我会被重定向到登录页面,这是预期的行为。我认为我不应该再做一次检查,看看是否有人登录了操作本身,这不应该事先由behaviours['access']处理吗?

尝试更改allowroles属性:

public function behaviors()
{
    return [
        'access' => [
            'class' => AccessControl::className(),
            'rules' => [
                [
                    'actions' => ['list'],
                    'allow' => true,
                    'roles' => ['@'],
                ],
            ], // rules
        ], // access
    ];
}

点击此处了解更多信息。

这是我对上面已经很好的答案的评价

将以下代码添加到项目中的主控制器文件中(不是基本控制器),但在此之上的一些控制器是其他控制器的基础

/**
 * Check if user is logged in and not logged out
 * 
 * @param type $action
 * @return type
 */
public function beforeAction($action) {
    $this->enableCsrfValidation = false;
    if(!empty($action) && $action->actionMethod == 'actionLogin') {
        return true;
    }
    /* Check User's Login Status */
    if (is_null(Yii::$app->user->identity)) {
        $this->redirect(Url::to(['../site/login']));
        Yii::$app->end();
    }
    return true;
}

最新更新