升级到Laravel 5.2会使所有会话无效

and*_*ber 18 session laravel laravel-routing laravel-5 laravel-5.2

从Laravel 5.1.17升级到5.2.我config/auth.php原来包含的:

'driver' => 'eloquent',
'model'  => 'Project\User',
'table'  => 'users',
Run Code Online (Sandbox Code Playgroud)

除了更新的命名空间外,新文件与默认文件相同.

'defaults' => [
    'guard' => 'web',
    'passwords' => 'users',
],
'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'api' => [
        'driver' => 'token',
        'provider' => 'users',
    ],
],
'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => Project\User::class,
    ],
],
Run Code Online (Sandbox Code Playgroud)

我的环境SESSION_DRIVERredis.我没有从Redis那里得到什么.(注意,这也发生在我的其他驱动程序项目中file,但我并不关心它们.)

我有两个分支,L5.2和master(在5.1.17上).切换分支后,我只是运行composer install

如果我登录,然后切换至15.2,我登出
如果我切换回,我重新登录
,如果我登录15.2,然后切换到,我保持登录状态
.如果我再次打开到L5.2,我保持登录状态

如果它会使我的所有用户的会话无效并迫使他们再次登录,我对升级犹豫不决.有办法避免这种情况吗?

修改过的唯一的其他文件是composer.json,composer.lock,app/Exceptions/Handler.php,和config/app.php; 什么都没有触及Auth.

and*_*ber 2

我找出了导致会话无效的原因。问题在于会话防护的getName()方法。

在 5.1.17 中:

return 'login_'.md5(get_class($this));
Run Code Online (Sandbox Code Playgroud)

在 5.2 中(默认$this->name情况web下):

return 'login_'.$this->name.'_'.sha1(get_class($this));
Run Code Online (Sandbox Code Playgroud)

此外,类名本身也从Guard变为SessionGuard

如果我将此方法替换为:

return 'login_'.md5('Illuminate\Auth\Guard');
Run Code Online (Sandbox Code Playgroud)

这使我的会话保持登录状态。

这是进步,但还不是完整的解决方案。真正的解决方案是使用新名称更新所有现有会话。我将编写一个脚本来完成此任务,然后更新我的答案。