@alexsteadfast
PHP Developer

Почему не работает авторизация в Yii2 через БД?

Пытаюсь реализовать авторизацию юзеров на сайте в YII2 шаблон -advanced
Форма
<?php $form = ActiveForm::begin(['id' => 'login-form']); ?>
            <input type="hidden" name="<?=Yii::$app->request->csrfParam; ?>" value="<?=Yii::$app->request->getCsrfToken(); ?>" />
                <?= $form->field($model, 'username')->textInput(['autofocus' => true]) ?>
                <?= $form->field($model, 'pass')->passwordInput() ?>              
                <div style="color:#999;margin:1em 0">
                    If you forgot your password you can <?= Html::a('reset it', ['site/request-password-reset']) ?>.
                </div>
                <div class="form-group">
                    <?= Html::submitButton('Login', ['class' => 'btn btn-primary', 'name' => 'login-button']) ?>
                </div>
            <?php ActiveForm::end(); ?>


Контроллер
public function actionLogin()
    {
        if (!Yii::$app->user->isGuest) {
            return $this->goHome();
        }
 
        $model = new UserIdentity();
        if ($model->load(Yii::$app->request->post()) 
            && $model->login()) {
            return $this->goBack();
        }
        return $this->render('login', [
            'model' => $model,
        ]);
    }
Модель
<?php

namespace frontend\models;


use Yii;

/**
 * This is the model class for table "User".
 *
 * @property string $username
 * @property string $email
 * @property string $phone
 * @property string $ava
 * @property integer $id
 * @property string $auth_key
 * @property string $token
 * @property string $status
 * @property string $pass
 */
class User extends \yii\db\ActiveRecord implements \yii\web\IdentityInterface
{
	 const DEFAULT_STATUS = 0;
     const DEFAULT_ROLE = 'user';
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'User';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['username', 'email', 'phone', 'ava', 'id', 'auth_key', 'token', 'status', 'pass'], 'required'],
            [['username', 'email', 'phone', 'ava', 'status', 'pass'], 'string'],
            [['id'], 'integer'],
            [['auth_key', 'token'], 'string', 'max' => 32],
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'username' => 'Username',
            'email' => 'Email',
            'phone' => 'Phone',
            'ava' => 'Ava',
            'id' => 'ID',
            'auth_key' => 'Auth Key',
            'token' => 'Token',
            'status' => 'Status',
            'pass' => 'Pass',
        ];
    }
	
	
	
	public static function findIdentity($id)
    {
        return static::findOne($id);
    }
	
	public static function findByUsername($username)
{
return static::findOne(['username' => $username]);
}

public function validatePassword($password)

{
return \Yii::$app->security->validatePassword($password, $this->password);
}
    
    public function getId()
    {
        return $this->id;
    }
    
    public static function findIdentityByAccessToken($token, $type = null)
    {
      
    }
    
    public function getAuthKey()
    {
       
    }
	

    public function validateAuthKey($authKey)
    {
      
    }
	
	   public function login()
    {
        if ($this->validate()) {
            return Yii::$app->UserIdentity->login($this->getUser(), $this->rememberMe ? 3600 * 24 * 30 : 0);
        }
        
        return false;
    }
}</spoiler>


Модель наследник
<?php

namespace frontend\models;

class UserIdentity extends User implements \yii\web\IdentityInterface
{
     private $pass;

    public static function findIdentity($id)
    {
        return static::findOne($id);
    }

    /**
     * @inheritdoc
     */
    public static function findIdentityByAccessToken($token, $type = null)
    {
       
        return static::findOne(['token' => $token]);
    }

    /**
     * Finds user by username
     *
     * @param string $username
     * @return static|null
     */
    public static function findByUsername($username)
    {
		return static::findOne(['username' => $username]);
    }

    /**
     * @inheritdoc
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @inheritdoc
     */
    public function getAuthKey()
    {
        return $this->auth_key;
    }

    /**
     * @inheritdoc
     */
    public function validateAuthKey($authKey)
    {
        return $this->auth_key === $authKey;
    }

    /**
     * Validates password
     *
     * @param string $password password to validate
     * @return bool if password provided is valid for current user
     */
    public function validatePassword($password)
    {
        return $this->pass === md5($password);
    }
}

В БД есть таблицца Юзер с необходимыми полями, сама модель User была сгенерирована в GII.
Результат, после ввода правильных данных и не правильных данных, форма просто отправляется без ошибок.
  • Вопрос задан
  • 127 просмотров
Решения вопроса 1
slo_nik
@slo_nik
В правилах валидации Вы проверяете лишние атрибуты, требуете, чтобы они были обязательно заполнены.
[['username', 'email', 'phone', 'ava', 'id', 'auth_key', 'token', 'status', 'pass'], 'required'],

На самом же деле Вы передаёте только username и pass!
Вот поэтому форма обновляется и ошибок не видно, так как нет полей в форме для остальных проверяемых атрибутов.
Уберите лишнее и продолжайте тестирование.

p.s.
Измените эту строку
return $this->pass === md5($password);
Для шифрования в yii2 есть специальный метод.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@alexsteadfast Автор вопроса
PHP Developer
slo_nik, skrinshoter.ru/s/180218/TQjFept7?a ошибки скриптов из YII JS
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
Max.Credit Санкт-Петербург
от 150 000 до 150 000 руб.
Willz Москва
от 150 000 руб.
Fmedia Санкт-Петербург
от 40 000 до 100 000 руб.
14 авг. 2018, в 19:03
10000 руб./за проект
14 авг. 2018, в 18:10
1000 руб./в час
14 авг. 2018, в 18:01
12000 руб./за проект