Обновление с 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. Из Redis ничего не очистил. (Обратите внимание, это также происходило в других моих проектах, где драйвером был file, но меня это не заботило так сильно для них.)

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

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

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

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

18
andrewtweber 25 Дек 2015 в 11:30

2 ответа

Лучший ответ

Я понял, что вызывает недействительность сеанса. Проблема заключается в методе защиты сеанса 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');

Благодаря этому мои сеансы остаются в системе.

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

2
andrewtweber 4 Янв 2016 в 19:18

То, что вам следует сделать, это открыть 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.

1
Marcin Nabiałek 14 Янв 2016 в 20:08