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

Upgrading to Laravel 5.2 invalidates all sessions

正在从 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,
    ],
],

我的环境 SESSION_DRIVERredis。我没有从 Redis 清除任何东西。 (请注意,这也发生在我的其他驱动程序是 file 的项目中,但我对它们并不关心。)

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

If I login on master, then switch to L5.2, I am logged out
If I switch back to master, I am logged back in
If I login on L5.2, then switch to master, I stay logged in
If I switch back to L5.2, I stay logged in

如果升级会使我所有用户的会话失效并强制他们重新登录,我会犹豫是否升级。有没有办法避免这种情况?

唯一修改的其他文件是 composer.jsoncomposer.lockapp/Exceptions/Handler.phpconfig/app.php;没有触及 Auth.

你应该做的是打开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

这似乎是官方预期的行为,因为已添加升级指南:

Because of changes to the authentication system, any existing sessions will be invalidated when you upgrade to Laravel 5.2.

我找出导致会话无效的原因。问题是会话守卫的 getName() 方法。

在 5.1.17 中:

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

在 5.2 中($this->name 默认为 web):

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

此外,class 名称本身从 Guard 更改为 SessionGuard

如果我将此方法替换为:

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

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

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