Обновление до 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
; ничего, что коснулось Аута.
Ответы
Ответ 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.