Подтвердить что ты не робот

Обновление до Laravel 5.2 аннулирует все сеансы

Обновление с Laravel 5.1.17 до 5.2. Мой config/auth.php изначально содержал:

'driver' => 'eloquent',
'model'  => 'Project\User',
'table'  => 'users',

Новый файл совпадает с по умолчанию, за исключением обновленного пространства имен.

'defaults' => [
    'guard' => 'web',
    'passwords' => 'users',
],
'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'api' => [
        'driver' => 'token',
        'provider' => 'users',
    ],
],
'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => Project\User::class,
    ],
],

Мой env SESSION_DRIVER - redis. Я ничего не понял от Редис. (Заметьте, это также произошло в моих других проектах, где драйвер был file, но для меня это было не так важно.)

У меня две ветки, L5.2 и master (которая находится на 5.1.17). После переключения ветвей я просто запускаю composer install

Если я login на мастер, затем переключитесь на L5.2, я выйду из системы
Если я вернусь к мастер, я вернусь обратно в
Если я login на L5.2, то переключитесь на мастер, я остаюсь в системе

Если я вернусь к L5.2, я остаюсь в системе

Я не решаюсь обновиться, если это приведет к аннулированию всех сеансов моих пользователей и заставит их снова войти в систему. Есть ли способ избежать этого?

Единственными другими модифицированными файлами были composer.json, composer.lock, app/Exceptions/Handler.php и config/app.php; ничего, что коснулось Аута.

4b9b3361

Ответ 1

Я понял, что вызывает сессию недействительным. Проблема заключается в методе защиты сеанса getName().

В 5.1.17:

return 'login_'.md5(get_class($this));

В 5.2 ($this->name по умолчанию будет web):

return 'login_'.$this->name.'_'.sha1(get_class($this));

Кроме того, само имя класса изменяется от Guard до SessionGuard

Если я заменил этот метод:

return 'login_'.md5('Illuminate\Auth\Guard');

Это позволяет моим сеансам регистрироваться.

Это прогресс, но не полное решение. Реальное решение - обновить все существующие сеансы с новым именем. Я поработаю над script, чтобы завершить это, а затем обновить свой ответ.

Ответ 2

Что вы должны сделать, это открыть app/Http/routes.php

и заверните все существующие маршруты:

Route::group(['middleware' => ['web']], function () {
    // here your previous routes
});

ИЗМЕНИТЬ

После тестирования я могу подтвердить это поведение.

В таких случаях:

  • 5.1.17 → 5.2
  • 5.1.23 → 5.2
  • 5.1.28 → 5.2. *

после обновления до 5.2. Пользователь больше не регистрируется. При входе в версии в 5.1 филиал остается включенным. При возврате с 5.2 до 5.1 пользователь снова регистрируется.

На данный момент вы, вероятно, должны создать проблему здесь https://github.com/laravel/framework/issues и ждать ответа

EDIT2

Кажется, это официальное и ожидаемое поведение, потому что добавлено руководство по обновлению:

Из-за изменений в системе аутентификации любые существующие сеансы будут аннулированы при обновлении до Laravel 5.2.