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

时间:2015-12-25 08:30:11

标签: laravel session laravel-5 laravel-routing 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_DRIVERredis。我没有从Redis那里得到什么。 (注意,这也发生在我的其他驱动程序为file的项目中,但我并不关心它们。)

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

  

如果我登录 ,请切换到 L5.2 ,我已注销   如果我切换回主人,我将重新登录   如果我登录 L5.2 ,然后切换到,我会保持登录状态   如果我切换回 L5.2 ,我会保持登录状态

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

修改过的唯一其他文件包括composer.jsoncomposer.lockapp/Exceptions/Handler.phpconfig/app.php;什么都没有触及Auth。

2 个答案:

答案 0 :(得分:2)

我弄清楚导致会话失效的原因。问题是会话守卫的getName()方法。

在5.1.17中:

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

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

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

此外,班级名称本身也会从Guard更改为SessionGuard

如果我用以下方法替换此方法:

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

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

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

答案 1 :(得分:1)

你应该做的是开放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时,任何现有会话都将失效。