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

18

将 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.7上)。 切换分支后,我只需运行composer install

如果我在master登录,然后切换到L5.2,我就会注销
如果我切换回master,我就会再次登录
如果我在L5.2登录,然后切换到master,我会保持登录状态
如果我切换回L5.2,我会保持登录状态

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

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


难道没有其他人遇到过这个问题吗?我在两个不同的服务器上进行了6个不同项目,都出现了这个问题。我不可能是唯一一个遇到这个问题的人。 - andrewtweber
我不明白一件事 - 你说在5.1.17和5.2之间只有composer.jsoncomposer.lock等四个文件被更改了,但实际上你也改变了其他文件(例如app/Http/routes.php以包括web中间件)。在切换分支时,你是否还更改了其他文件?我是指像Kernel.php这样的文件? - Marcin Nabiałek
@MarcinNabiałek 我只是更改了路由以测试您的答案。之后我又将其恢复了。只涉及这4个文件。 - andrewtweber
如果您查看https://laravel.com/docs/5.2/upgrade#upgrade-5.2.0,您会发现升级到5.2版本需要进行更多的更改(其中第一个提到的是`config/auth.php`),所以如果我是您,我首先会确保我有有效的`app`结构 - 最好的方法可能是克隆https://github.com/laravel/laravel并将其与您的app文件夹进行比较,以查看所有差异,然后将所有必要的更改与您的代码合并。 - Marcin Nabiałek
@MarcinNabiałek 我已经更新了 config/auth.php,这是问题的主要部分。虽然比较是个好主意,我会尝试一下。 - andrewtweber
@MarcinNabiałek 我想我只是指那5个文件而不是4个。config/auth.php是问题的一部分,还有最后提到的4个文件。升级指南中的其他内容对我不适用。 - andrewtweber
2个回答

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');

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

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


1
好的,我也认为会话名称内部可能发生了一些变化,但是我没有时间验证这一点。这很奇怪,所以肯定进行了重大更改,但我在升级指南中没有看到任何相关信息。 - Marcin Nabiałek
@MarcinNabiałek 如果没有旧的会话数据进行比较,你很难进行验证。这是我找出问题的唯一方法。 - andrewtweber
1
现在在 Laravel 5.2 的升级指南中有这样的说明:由于认证系统的更改,当您升级到 Laravel 5.2 时,任何现有的会话都将被作废。 - Marcin Nabiałek

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创建问题并等待回复。

编辑2

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

由于身份验证系统的更改,升级到Laravel 5.2时将使任何现有会话无效。


@andrewtweber 你的 Handler 是否看起来像这样:https://github.com/laravel/laravel/blob/master/app/Http/Kernel.php?你已经删除了缓存文件吗? - Marcin Nabiałek
抱歉,我认为这只有在使用新的中间件组更新您的 Http/Kernel.php 文件时才会生效。如果您将其保留原样,则所有旧的中间件(EncryptCookiesStartSession 等)都在 $middleware 数组中,并且默认情况下应用于每个路由。 - andrewtweber
换句话说,您可以同时升级内核和路由,或者两者都不升级。 - andrewtweber
不,如果我不对这两个文件进行任何更改或更新这两个文件,无论哪种方式都不起作用。 - andrewtweber
所以你应该将问题放在 Github 上并等待答案。目前我不知道为什么会发生这种情况。 - Marcin Nabiałek
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接