升级到 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_DRIVER
是 redis
。我没有从 Redis 清除任何东西。 (注意,这也发生在我的其他驱动程序为file
的项目中,但我对他们并不关心。)
我有两个分支,L5.2 和 master(在 5.1.17 上)。切换分支后,我直接运行composer install
如果我在 master 上登录,然后切换到 L5.2,我将退出 如果我切换回 master,我将重新登录 如果我在 L5.2 上登录,然后切换到 master,我将保持登录状态 如果我切换回 L5.2,我会保持登录状态
如果升级会使我所有用户的会话无效并强制他们再次登录,我会犹豫。有没有办法避免这种情况?
其他被修改的文件只有composer.json
、composer.lock
、app/Exceptions/Handler.php
和config/app.php
;没有涉及到 Auth。
【问题讨论】:
没有其他人经历过这种情况吗?这发生在我在 2 个不同服务器上的 6 个不同项目上。我不能成为唯一的人 我不明白一件事 - 你告诉只有在 5.1.17 和 5.2 之间更改的文件是composer.json
、composer.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
文件时才会这样做。如果你保持原样,那么所有旧的中间件(EncryptCookies
、StartSession
等)都在 $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:如何从自己的事件监听器访问请求和会话类?