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

Posted

技术标签:

【中文标题】升级到 Laravel 5.2 会使所有会话失效【英文标题】:Upgrading to Laravel 5.2 invalidates all sessions 【发布时间】:2016-03-31 09:35:56 【问题描述】:

从 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

如果我在 ma​​ster登录,然后切换到 L5.2,我将退出 如果我切换回 ma​​ster,我将重新登录 如果我在 L5.2登录,然后切换到 ma​​ster,我将保持登录状态 如果我切换回 L5.2,我会保持登录状态

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

其他被修改的文件只有composer.jsoncomposer.lockapp/Exceptions/Handler.phpconfig/app.php;没有涉及到 Auth。

【问题讨论】:

没有其他人经历过这种情况吗?这发生在我在 2 个不同服务器上的 6 个不同项目上。我不能成为唯一的人 我不明白一件事 - 你告诉只有在 5.1.17 和 5.2 之间更改的文件是 composer.jsoncomposer.lock 等(总共 4 个文件)但实际上你也改变了其他文件(例如app/Http/routes.php 包括web 中间件。在分支之间切换时您是否更改了其他文件?我的意思是Kernel.php 等? @MarcinNabiałek 我只更改了路线来测试您的答案。后来我把它恢复了。就是这4个文件 如果您查看laravel.com/docs/5.2/upgrade#upgrade-5.2.0,您会发现您应该进行更多更改以升级到版本 5.2(首先提到的是config/auth.php,所以如果我是您,我会首先确保我具有有效的 app 结构 - 最好的方法可能是克隆 https://github.com/laravel/laravel 并将其与您的 app 文件夹进行比较以查看所有差异,然后将所有必要的更改与您的代码合并。 @MarcinNabiałek 我确实更新了config/auth.php,这是问题的主要部分。比较好主意,我会试试的 【参考方案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 时,任何现有会话都将失效。

【讨论】:

没有用。反射异常类“web”不存在。我也试过auth:web,它没有抛出异常,但它仍然让我退出 @andrewtweber 您的 Handler 看起来像这样吗:github.com/laravel/laravel/blob/master/app/Http/Kernel.php?您是否删除了缓存文件? 不,它没有$middlewareGroups。当我添加组时,我可以使用您在回答中所说的middleware => web,但它仍然会将我从我的帐户中注销。清除缓存什么也没做 对不起,但我认为只有在您使用新的中间件组更新您的 Http/Kernel.php 文件时才会这样做。如果你保持原样,那么所有旧的中间件(EncryptCookiesStartSession 等)都在 $middleware 数组中,并且默认应用于每个路由 所以换句话说,你可以升级内核和路由,或者都不升级【参考方案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');

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

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

【讨论】:

很高兴知道。我还认为会话名称可能在内部发生了一些变化,但没有时间验证这一点,但这很奇怪,所以已经进行了严重的更改,我在升级指南中没有看到任何有关它的信息 @MarcinNabiałek 如果没有比较旧的会话数据,您将很难验证。这是我想通的唯一方法 现在在 laravel 5.2 的升级指南中有:Because of changes to the authentication system, any existing sessions will be invalidated when you upgrade to Laravel 5.2.

以上是关于升级到 Laravel 5.2 会使所有会话失效的主要内容,如果未能解决你的问题,请参考以下文章

laravel 升级到 5.2

Laravel 5.2:在用户登录/注销和注册后显示会话闪烁消息

Laravel 5.2 - 会话不会在路由更改中持续存在

Laravel 5.2:如何从自己的事件监听器访问请求和会话类?

Laravel 5.2:如何从自己的事件监听器访问请求和会话类?

Laravel 5.2 会话不持久