Трабла с сессией, авторизацией, авторазлогинивание!!!

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

Трабла с сессией, авторизацией, авторазлогинивание!!!

Сообщение espltdmh50 »

Доброго дня! Нужна помощь. Развернул новый проект через composer. Первым делом взялся за авторизацию юзера из БД.

Юзер из базы достается без проблем, валидацию пароля и логина проходит, далее объект юзера передается в метод login и тут начинается самое интересное. Появляется приветственное имя, типа привет admin, далее стоит сделать переход по ссылке, как тут же разлогинивается. И приходится логинится по новой. Потом опять тоже самое - переход по ссылке, и опять становишься гостем. Не понимаю что за хрень.

LoginForm

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

<?php

namespace app\models;

use Yii;
use yii\base\Model;

/**
 * LoginForm is the model behind the login form.
 *
 * @property User|null $user This property is read-only.
 *
 */
class LoginForm extends Model
{
    public $username;
    public $password;
    public $rememberMe = true;

    private $_user = false;


    /**
     * @return array the validation rules.
     */
    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'],
        ];
    }
    
    //лэйблы
    public function attributeLabels()
    {
        return [
            'username' => 'Логин',
            'password' => 'Пароль',
            'rememberMe' => 'Запомнить меня',
        ];
    }
    

    /**
     * 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->user->login($this->getUser(), $this->rememberMe ? 3600*24*30 : 0);
            //Yii::$app->user->login($this->getUser());
        }
        return false;
    }

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



Users

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

<?php

namespace app\models;

use Yii;

/**
 * This is the model class for table "users".
 *
 * @property integer $user_id
 * @property string $username
 * @property string $password
 * @property integer $role
 * @property string $created_at
 * @property string $update_at
 */
class Users extends \yii\db\ActiveRecord
{
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'users';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['username', 'password'], 'required'],
            [['role'], 'integer'],
            [['created_at', 'update_at'], 'safe'],
            [['username'], 'string', 'max' => 50],
            [['password'], 'string', 'max' => 255],
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'user_id' => 'User ID',
            'username' => 'Username',
            'password' => 'Password',
            'role' => 'Role',
            'created_at' => 'Created At',
            'update_at' => 'Update At',
        ];
    }
}


UserIdentity

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

<?php

namespace app\models;

class UserIdentity extends Users implements \yii\web\IdentityInterface
{


    /**
     * @inheritdoc
     */
    public static function findIdentity($id)
    {
        return static::findOne($id);
    }

    /**
     * @inheritdoc
     */
    public static function findIdentityByAccessToken($token, $type = null)
    {
        return static::findOne(['access_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->password === $password;
    }
}

skynin
Сообщения: 400
Зарегистрирован: 2017.12.12, 10:09

Re: Трабла с сессией, авторизацией, авторазлогинивание!!!

Сообщение skynin »

-- Потом опять тоже самое - переход по ссылке, и опять становишься гостем.
настройки неправильные значит.

смотрите в папке config/main.php
components => user

main-local.php
'components' => [
'request' => [
// !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
'cookieValidationKey' =>
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Трабла с сессией, авторизацией, авторазлогинивание!!!

Сообщение espltdmh50 »

skynin писал(а): 2018.06.13, 15:37 -- Потом опять тоже самое - переход по ссылке, и опять становишься гостем.
настройки неправильные значит.

смотрите в папке config/main.php
components => user

main-local.php
'components' => [
'request' => [
// !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
'cookieValidationKey' =>


main.php

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


<?php

$params = require(__DIR__ . '/params.php');

$config = [
    'id' => 'basic',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'language' => 'ru', 
    'modules' => [
        'adm' => [
            'class' => 'app\modules\adm\Module',
        ],
        'lk' => [
            'class' => 'app\modules\lk\Module',
        ],
    ],
    'components' => [
        'request' => [
            // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
            'cookieValidationKey' => 'O4Ow05cnmPvEDeU6-OH3q8F5T7Jvd3cy',
        ],
        
        //'session' => [
            //'class' => 'yii\web\DbSession',
            //'db' => 'db',  // ID компонента для взаимодействия с БД. По умолчанию 'db'.
            //'sessionTable' => 'session', // название таблицы для хранения данных сессии. По умолчанию 'session'.
        //],
        
        //'cache' => [
            //'class' => 'yii\caching\FileCache',
        //],
        'user' => [
            'identityClass' => 'app\models\UserIdentity',
            'loginUrl' => ['form/login'],
            'enableAutoLogin' => true,
        ],
        'errorHandler' => [
            'errorAction' => 'site/error',
        ],

skynin
Сообщения: 400
Зарегистрирован: 2017.12.12, 10:09

Re: Трабла с сессией, авторизацией, авторазлогинивание!!!

Сообщение skynin »

espltdmh50 писал(а): 2018.06.13, 15:41

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

        'user' => [
            'identityClass' => 'app\models\UserIdentity',
            'loginUrl' => ['form/login'],
            'enableAutoLogin' => true,
        ],
у меня в живом проекте

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

'user' => [
            'identityClass' => 'app\models\User',
            'enableAutoLogin' => true,
            'on afterLogin' => 'app\models\LoginForm::afterAppLogin',
            'identityCookie' => ['name' => '_id-gamer'],
        ],
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
chesar
Сообщения: 514
Зарегистрирован: 2013.04.10, 17:49

Re: Трабла с сессией, авторизацией, авторазлогинивание!!!

Сообщение chesar »

Смотри в браузере, появляется ли кука с сессией. Наименование куки/сессии. Где хранится сессия?
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Трабла с сессией, авторизацией, авторазлогинивание!!!

Сообщение espltdmh50 »

да, кука с сессией появляется. Вот сделал 3 скриншота на которых состояние до, после авторизации, и после перехода по любой из ссылок. После введения логина и пароля вылазит привет admin. Далее один переход по ссылке, как тут же ни какого привет админ уже и в помине нет, разлогинивается как будто, хотя сессия продолжает оставаться неизменной.

Изображение




Изображение





Изображение
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Трабла с сессией, авторизацией, авторазлогинивание!!!

Сообщение espltdmh50 »

через дебагер заметил следущее.

авторизовался, в куках появилась сессия. Глобальный массив $_SESSION пуст.

Изображение

Изображение

прошел по ссылке, сессия сбросилась.

Изображение
skynin
Сообщения: 400
Зарегистрирован: 2017.12.12, 10:09

Re: Трабла с сессией, авторизацией, авторазлогинивание!!!

Сообщение skynin »

espltdmh50 писал(а): 2018.06.14, 07:32 Далее один переход по ссылке, как тут же ни какого привет админ уже и в помине нет
там может проблема в генерации html во view?

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

<?php if(Yii::$app->user->isGuest): ?>
...
<?php else: ?>
...
<?php endif; ?>

присутствует?

сложная какая-то у вас ситуация. за годы работы с Yii не сталкивался ни разу...
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Трабла с сессией, авторизацией, авторазлогинивание!!!

Сообщение espltdmh50 »

точно не во вьюхе дело. Сделал банальную проверку, если не авторизован, выведи надпись гость, иначе не гость. В итоге до авторизации пишет гость, после авторизации не гость. И стоит нажать хоть на одну ссылку, как тут же надпись меняется на гость. Сам впервые столкнулся.
skynin
Сообщения: 400
Зарегистрирован: 2017.12.12, 10:09

Re: Трабла с сессией, авторизацией, авторазлогинивание!!!

Сообщение skynin »

espltdmh50 писал(а): 2018.06.14, 09:05 И стоит нажать хоть на одну ссылку
то есть запустить генерацию html в ответ.
и если там нет разной генерации для гостя и пользователя - то ответ будет одинаков.
espltdmh50 писал(а): 2018.06.14, 09:05 Сам впервые столкнулся.
один из моих рецептов, когда все делаю по документации, а не работает

ставлю в коде фреймворка отладочный вывод Yii::debug
чтобы найти с какого места фреймворк "глючит"

понять что у вас не так настроено сложно
может вообще в php.ini что-то интересное.
или у самого браузера какая-то настройка, плагин. пробовали кстати разными браузерами, без обвесок?
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Трабла с сессией, авторизацией, авторазлогинивание!!!

Сообщение Dominus »

Была похожая проблема: https://www.yiiframework.ru/forum/viewt ... 19&t=46857
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Трабла с сессией, авторизацией, авторазлогинивание!!!

Сообщение espltdmh50 »

skynin писал(а): 2018.06.14, 09:10
espltdmh50 писал(а): 2018.06.14, 09:05 И стоит нажать хоть на одну ссылку
то есть запустить генерацию html в ответ.
и если там нет разной генерации для гостя и пользователя - то ответ будет одинаков.
espltdmh50 писал(а): 2018.06.14, 09:05 Сам впервые столкнулся.
один из моих рецептов, когда все делаю по документации, а не работает

ставлю в коде фреймворка отладочный вывод Yii::debug
чтобы найти с какого места фреймворк "глючит"

понять что у вас не так настроено сложно
может вообще в php.ini что-то интересное.
или у самого браузера какая-то настройка, плагин. пробовали кстати разными браузерами, без обвесок?

браузеры разные пробовал, бесполезно. php.ini. вот фрагмет SESSION.

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


[Session]
session.save_handler = files
session.save_path = "c:/openserver/userdata/temp/"
session.use_cookies = 1
;session.cookie_secure =
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.bug_compat_42 = On
session.bug_compat_warn = On
session.referer_check =
;session.entropy_length = 32
;session.entropy_file = /dev/urandom
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.hash_function = 0
session.hash_bits_per_character = 5
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"
;session.upload_progress.enabled = On
;session.upload_progress.cleanup = On
;session.upload_progress.prefix = "upload_progress_"
;session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS"
;session.upload_progress.freq =  "1%"
;session.upload_progress.min_freq = "1"



данное решение https://www.yiiframework.ru/forum/viewt ... 19&t=46857 увы, тоже не помогло!(
delgus
Сообщения: 55
Зарегистрирован: 2018.01.29, 14:07
Откуда: Ярославль

Re: Трабла с сессией, авторизацией, авторазлогинивание!!!

Сообщение delgus »

Похоже на <img src="/logout">. Хотя в yii2 такого косяка не должно быть, там даже в базовом приложении явно показано что logout через post надо делать)
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Трабла с сессией, авторизацией, авторазлогинивание!!!

Сообщение espltdmh50 »

delgus писал(а): 2018.06.14, 11:15 Похоже на <img src="/logout">. Хотя в yii2 такого косяка не должно быть, там даже в базовом приложении явно показано что logout через post надо делать)
можно подробнее, не совсем понял ваш комментарий
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Трабла с сессией, авторизацией, авторазлогинивание!!!

Сообщение espltdmh50 »

вот после авторизации получил объект Identity.

Изображение

после прохода по ссылке он пуст.

Изображение
skynin
Сообщения: 400
Зарегистрирован: 2017.12.12, 10:09

Re: Трабла с сессией, авторизацией, авторазлогинивание!!!

Сообщение skynin »

espltdmh50 писал(а): 2018.06.14, 11:05 увы, тоже не помогло!(
давайте сначала
-- Развернул новый проект через composer. Первым делом взялся за авторизацию юзера из БД.

ничего больше не правили?

тогда почему у вас
class Users extends \yii\db\ActiveRecord
?
в поставке ведь
class User extends extends ActiveRecord implements IdentityInterface

то есть вы зачем-то изменили название класса

при этом, в настройках у вас какой-то другой класс

'identityClass' => 'app\models\UserIdentity',

зачем UserIdentity?

Итого

Разверните новый проект через composer.
НИЧЕГО в нем не трогая - настройте в нем только конфиги

добейтесь от вашего окружения чтобы чистый проект заработал. без вашего кода. только конфиги.
Последний раз редактировалось skynin 2018.06.14, 11:36, всего редактировалось 2 раза.
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
delgus
Сообщения: 55
Зарегистрирован: 2018.01.29, 14:07
Откуда: Ярославль

Re: Трабла с сессией, авторизацией, авторазлогинивание!!!

Сообщение delgus »

espltdmh50 писал(а): 2018.06.14, 11:16
delgus писал(а): 2018.06.14, 11:15 Похоже на <img src="/logout">. Хотя в yii2 такого косяка не должно быть, там даже в базовом приложении явно показано что logout через post надо делать)
можно подробнее, не совсем понял ваш комментарий
https://youtu.be/_i1d9M40-qc?t=480
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Трабла с сессией, авторизацией, авторазлогинивание!!!

Сообщение espltdmh50 »

вот, все же отыскал это видео. Я делал по образу и подобию, может что-то пропустил?

https://www.youtube.com/watch?v=09PLyGJBAoE
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Трабла с сессией, авторизацией, авторазлогинивание!!!

Сообщение andku83 »

espltdmh50 писал(а): 2018.06.14, 16:26 ...Я делал по образу и подобию, может что-то пропустил?
может нужно проверить раз не уверен?
skynin писал(а): 2018.06.14, 11:26 Разверните новый проект через composer.
НИЧЕГО в нем не трогая - настройте в нем только конфиги

добейтесь от вашего окружения чтобы чистый проект заработал. без вашего кода. только конфиги.
espltdmh50
Сообщения: 569
Зарегистрирован: 2014.04.29, 19:14

Re: Трабла с сессией, авторизацией, авторазлогинивание!!!

Сообщение espltdmh50 »

Всем доброго дня. Решил последовать советам, но так и не удается сделать авторизацию по примеру, который на видео. Установил совершенно новый проект, с нуля. Начинаю делать те же действия, что представлены в видео. Но замечаю следующее.

1. Получаю объект identity Изображение

Это в методе validatePassword решил посмотреть объект $user = $this->getUser();

2. Далее, если пароль не верный, валидацию не проходит и пишет стандартное Incorrect username or password.

3. При вводе верного пароля, не выдает ни какой ошибки, тупо кидает на главную и не залогинивает!

Так и не могу понять, что не так делаю...
Ответить