yii2yii2-advanced-appyii2-user

yii2 disable inbuilt authentication


I have written my own Users model which extends ActiveRecord and implements IdentityInterface and also defined tablename. and implemented all methods.

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,
            ]);
        }
    }

UserLoginForm.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;
    }
}

And in backend/config/main.php

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

But after successful login, i get following error

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

I found that it is calling common/models/User.php class which by default present in advanced template. But why is it calling this class ? I want to use my own Users.php model. Please somone help me to fix this problem.


Solution

  • The class used for authentication is determined by the user application component, according to the authentication section of the Yii2 guide:

    The user application component manages the user authentication status. It requires you to specify an identity class which contains the actual authentication logic. In the following application configuration, the identity class for user is configured to be app\models\User whose implementation is explained in the next subsection:

    When you configure a new myuser component, the framework still uses the user component as it is configured by default, update your code, so it overwrites the user component, instead of creating a new myuser one.

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