yii2 禁用内置身份验证

问题描述

我编写了自己的 Users 模型,它扩展了 ActiveRecord 并实现了 IdentityInterface 并定义了表名。并实现了所有方法

Users.PHP

public static function tableName()
    {
        return 'users';
    }
// other methods are also present like rules(),getId() etc.

UserController.PHP

public function actionLogin()
    {
        $this->layout = 'blank';

        if (!Yii::$app->myuser->isGuest) {
            return 'hello';
        }


        $model = new UserLoginForm();
        if ($model->load(Yii::$app->request->post()) && $model->login()) {
            return $this->redirect(['user/view','id' => $model->getUser()->id,]);
        } else {
            $model->password = '';

            return $this->render('login',[
                'model' => $model,]);
        }
    }

用户登录表单.PHP

<?PHP

namespace backend\models;

use Yii;
use yii\base\Model;

class UserLoginForm extends Model
{

    public $username;
    public $password;
    public $rememberMe = true;

    private $_user;


    /**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            // username and password are both required
            [['username','password'],'required'],// rememberMe must be a boolean value
            ['rememberMe','boolean'],// password is validated by validatePassword()
            ['password','validatePassword'],];
    }

    /**
     * Validates the password.
     * This method serves as the inline validation for password.
     *
     * @param string $attribute the attribute currently being validated
     * @param array $params the additional name-value pairs given in the rule
     */
    public function validatePassword($attribute,$params)
    {
        if (!$this->hasErrors()) {
            $user = $this->getUser();
            if (!$user || !$user->validatePassword($this->password)) {
                $this->addError($attribute,'Incorrect username or password.');
            }
        }
    }

    /**
     * Logs in a user using the provided username and password.
     *
     * @return bool whether the user is logged in successfully
     */
    public function login()
    {
        if ($this->validate()) {
            return Yii::$app->myuser->login($this->getUser());
        }

        return false;
    }

    /**
     * Finds user by [[username]]
     *
     * @return Users|null
     */
    public function getUser()
    {
        if ($this->_user === null) {
            $this->_user = Users::findByUsername($this->username);
        }

        return $this->_user;
    }
}

在 backend/config/main.PHP

'myuser' => [
            'class' => 'yii\web\User','identityClass' => 'backend\models\Users','enableAutoLogin' => true,'identityCookie' => ['name' => '_identity-backend_user','httpOnly' => true],],

但是登录成功后出现如下错误

The table does not exist: {{%user}}

我发现它正在调用 common/models/User.PHP 类,该类认存在于高级模板中。但是为什么要调用这个类呢?我想使用我自己的 Users.PHP 模型。请有人帮我解决这个问题。

解决方法

根据 Yii2 指南的 user,用于身份验证的类由 authentication section 应用程序组件确定:

用户应用程序组件管理用户身份验证状态。它要求您指定一个包含实际身份验证逻辑的身份类。在以下应用程序配置中,用户的身份类配置为 app\models\User,其实现将在下一小节中说明:

当您配置新的 myuser 组件时,框架仍然使用默认配置的 user 组件,更新您的代码,因此它会覆盖 user 组件,而不是创建一个新的 myuser

'user' => [
    // Points to your custom class
    'identityClass' => 'backend\models\Users','enableAutoLogin' => true,'identityCookie' => ['name' => '_identity-backend','httpOnly' => true],],