Не работает авторизация из базы

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Не работает авторизация из базы

Сообщение espltdmh50 »

Доброго всем дня! Пытаюсь сделать авторизацию через базу. Некоторые ребята посоветовали скопипастить из advanced шаблона в basic. Так и сделал. Но при попытке отправки формы после введенного логина и пароля без конца пишет не корректное имя и пароль. Уже не знаю в чем еще может быть причина, на свои данные(поля, модели и прочее) - заменил!

Вот примеры Моделей и Экшна login.

Код: Выделить всё

<?php

namespace app\models;

use Yii;
use yii\db\ActiveRecord;
use yii\web\IdentityInterface;

/**
 * This is the model class for table "users".
 *
 * @property integer $id
 * @property string $name
 * @property string $email
 */
class People extends \yii\db\ActiveRecord
{
    
    
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'people';
    }



    /**
     * @inheritdoc
     
    public function rules()
    {
        return [
            [['login', 'password_hash', 'auth_key', 'phone'], 'required'],
            [['login'], 'string', 'max' => 20]
        ];
    }
    */


    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'login' => 'Логин',
            'password_hash' => 'Пароль',
            'auth_key' => 'Хэш куки',
            'phone' => 'Телефон'
        ];
    }
    
    
    
    /**
     * @inheritdoc
     */
    public static function findIdentity($id)
    {
        return static::findOne(['id' => $id);
    }
    
    
    
    
    /**
     * Находим юзера по имени юзера
     */
    public static function findByUsername($login)
    {
        return static::findOne(['login' => $login);
    }
    
    
    /**
     * Проверяем пароль
     */
    public function validatePassword($password)
    {
        return Yii::$app->security->validatePassword($password, $this->password_hash);
    }
    
    
    /**
     * Generates password hash from password
     */
    public function setPassword($password)
    {
        $this->password_hash = Yii::$app->security->generatePasswordHash($password);
    }
    
                                            
}

 





Код: Выделить всё

<?php

namespace app\models;

use Yii;
use yii\base\Model;

/**
 * LoginForm is the model behind the login form.
 */
class LoginForm extends Model
{
    public $login;
    public $password;
    public $rememberMe = false;

    private $_user = false;


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


    
       public function attributeLabels()
    {
        return array(
            'login' => 'Логин',
            'password' => 'Пароль',
            'rememberMe' => 'Запомнить меня',
        );
    }
    
    

    
    /**
     * Проверка пароля
     */
    public function validatePassword($attribute, $params)
    {
        if (!$this->hasErrors()) {
            $user = $this->getUser();
            if (!$user || !$user->validatePassword($this->password)) {
                $this->addError($attribute, 'Incorrect username or password.');
            }
        }
    }
    
    
    
    
    /**
     * Журналирование юзера с помощью логина и пароля
     */
    public function login()
    {
        if ($this->validate()) {
            return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600 * 24 * 30 : 0);
        } else {
            return false;
        }
    }
    
    
    
    /**
     * Находим юзера
     */
    protected function getUser()
    {
        if ($this->_user === null) {
            $this->_user = People::findByUsername($this->login);
        }

        return $this->_user;
    }
    
    
    
    
    
    
    
    
}

 


Код: Выделить всё

    public function actionLogin()
    {
        if (!\Yii::$app->user->isGuest) {
            return $this->goHome();
        }

        $model = new LoginForm();
        
        if ($model->load(Yii::$app->request->post()) && $model->login()) {
            return $this->goBack();
        } else {
            return $this->render('login', [
                'model' => $model,
            ]);
        }
    }
 

Код: Выделить всё

<?php

/* @var $this yii\web\View */
/* @var $form yii\bootstrap\ActiveForm */
/* @var $model app\models\LoginForm */

use yii\helpers\Html;
use yii\bootstrap\ActiveForm;

?>


<?php
    print_r($_POST);
?>


<div class="site-login">


    <?php $form = ActiveForm::begin([
        'id' => 'login-form',
        'options' => ['class' => 'form-horizontal'],
        'fieldConfig' => [
            'template' => "{label}\n<div class=\"col-lg-3\">{input}</div>\n<div class=\"col-lg-8\">{error}</div>",
            'labelOptions' => ['class' => 'col-lg-1 control-label'],
        ],
    ]); ?>

        <?= $form->field($model, 'login') ?>

        <?= $form->field($model, 'password')->passwordInput() ?>

        <?= $form->field($model, 'rememberMe')->checkbox([
            'template' => "<div class=\"col-lg-offset-1 col-lg-3\">{input} {label}</div>\n<div class=\"col-lg-8\">{error}</div>",
        ]) ?>

        <div class="form-group">
            <div class="col-lg-offset-1 col-lg-11">
                <?= Html::submitButton('Войти', ['class' => 'btn btn-info', 'name' => 'login-button']) ?>
            </div>
        </div>

    <?php ActiveForm::end(); ?>


</div>


andrei.obuhovski
Сообщения: 610
Зарегистрирован: 2015.07.16, 10:50

Re: Не работает авторизация из базы

Сообщение andrei.obuhovski »

Для начала определите что конкретно неверное: логин или пароль
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Не работает авторизация из базы

Сообщение espltdmh50 »

Вот пост данные из формы
Array ( [_csrf] => Z3VoTFRISC4/IBA1FT8bHB4NUQ0RcCUfKUYbIxgEPRZVM1h.YykRdw== [LoginForm] => Array ( [login] => espltd [password] => 12345 [rememberMe] => 0 ) [login-button] => )

соответственно как видно из параметра password он не делает хэш, соответственно в базе хэш с введенным он не может сверить, или я не прав? По логике он должен получить определенный пароль, например 12345, из него сделать хэш, затем сверить с хэшем который в базе. Но я не пойму, почему этого не происходит. Весь код как в advanced шаблоне.
andrei.obuhovski
Сообщения: 610
Зарегистрирован: 2015.07.16, 10:50

Re: Не работает авторизация из базы

Сообщение andrei.obuhovski »

В хэш он преобразует на этапе проверки.

Сделайте:

Код: Выделить всё

    public function validatePassword($attribute, $params)
    {
        if (!$this->hasErrors()) {
            $user = $this->getUser();
            if (!$user || !$user->validatePassword($this->password)) {
            
            var_dump(!$user,!$user->validatePassword($this->password)); 
            exit;
            
                $this->addError($attribute, 'Incorrect username or password.');
            }
        }
    }
 
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Не работает авторизация из базы

Сообщение espltdmh50 »

В общем, в модели People

class People extends \yii\db\ActiveRecord сюда добавил implements IdentityInterface
и странным образом заработало. И еще обнаружил ошибку в конфиге. В компоненте user был подключен класс user, а у меня people. Так что, будьте внимательны! Друзья товарищи)))))) Спасибо.
FarengarDazus
Сообщения: 2
Зарегистрирован: 2021.03.02, 12:13

Re: Не работает авторизация из базы

Сообщение FarengarDazus »

У меня также не работает авторизация через БД, ошибок не выдает.
При этом когда я сдавал экзамен, работая уже не с локалхоста на phpmyadmin, а на выделенном сервере FileZilla авторизация работала.
Не могу сдать экзамен, который наш техникум взял с задания WorldSkills, по моему это слишком зашкварно и тяжело даже для 4 курса, поскольку код надо наизусть выучить, что для гумманитария, ненавидящего математику и все что с ней связано невозможно.

user.php

Код: Выделить всё

<?php

namespace app\models;

class User extends \yii\db\ActiveRecord implements \yii\web\IdentityInterface
{
    public $id;
    public $username;
    public $password;
    public $fio;
    public $email;
    public $admin;
    // public $authKey;
    // public $accessToken;

    private static $users = [
            '100' => [
            'id' => '100',
            'username' => 'admin',
            'password' => 'adminWSR',
            'authKey' => 'test100key',
            'accessToken' => '100-token',
        ]
        ];
        
    /**
     * {@inheritdoc}
     */
    public static function findIdentity($id)
    {
        return self::findne($id);
        return isset(self::$users[$id]) ? new static(self::$users[$id]) : null;
    }
    /**
     * Finds user by username
     *
     * @param string $username
     * @return static|null
     */
    public static function findByUsername($username)
    {
        return self::find()->where(['username' => $username])->one();
        
    }
    
     /**
     * Validates password
     *
     * @param string $password password to validate
     * @return bool if password provided is valid for current user
     */
    public function validatePassword($password)
    {
        return $this->password === $password;
    }

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

#################################################################################
    /**
     * {@inheritdoc}
     */
    public static function findIdentityByAccessToken($token, $type = null)
    {
        foreach (self::$users as $user) {
            if ($user['accessToken'] === $token) {
                return new static($user);
            }
        }

        //return null;
    }



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

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

Код: Выделить всё

<?php

return [
    'class'=>'yii\db\Connection',
    'dsn'=>'mysql:host=localhost;dbname=dragon',
    'username'=>'phpmyadmin',
    'password'=>'dragon1476',
    'charset'=>'utf8'

    // Schema cache options (for production environment)
    //'enableSchemaCache' => true,
    //'schemaCacheDuration' => 60,
    //'schemaCache' => 'cache',
];
Модули:

Изображение

База данных, которая исчезает при изменении версии MySql:

Изображение
FarengarDazus
Сообщения: 2
Зарегистрирован: 2021.03.02, 12:13

Re: Не работает авторизация из базы

Сообщение FarengarDazus »

Мда, похоже мне никогда не сдать этот гребанный экзамен и придется идти на второй год на 4 курсе(
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Не работает авторизация из базы

Сообщение unknownby »

FarengarDazus писал(а): 2021.03.12, 09:11 База данных, которая исчезает при изменении версии MySql:
Мда, похоже мне никогда не сдать этот гребанный экзамен и придется идти на второй год на 4 курсе
База данных не исчезает :)
Если вернуть версию MySQL обратно, то база данных вернётся.
Через что пробуете входить в систему? Через форму авторизации?

Почему здесь два возврата?

Код: Выделить всё

    public static function findIdentity($id)
    {
        return self::findne($id);
        return isset(self::$users[$id]) ? new static(self::$users[$id]) : null;
    }
Ответить