从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_DRIVER
是redis
。我没有从Redis那里得到什么。 (注意,这也发生在我的其他驱动程序为file
的项目中,但我并不关心它们。)
我有两个分支,L5.2和master(在5.1.17上)。切换分支后,我只需运行composer install
如果我登录 主,请切换到 L5.2 ,我已注销 如果我切换回主人,我将重新登录 如果我登录 L5.2 ,然后切换到主,我会保持登录状态 如果我切换回 L5.2 ,我会保持登录状态
如果它会使我的所有用户的会话无效并迫使他们再次登录,我对升级犹豫不决。有没有办法避免这种情况?
修改过的唯一其他文件包括composer.json
,composer.lock
,app/Exceptions/Handler.php
和config/app.php
;什么都没有触及Auth。
答案 0 :(得分: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 :(得分:1)
你应该做的是开放app/Http/routes.php
并用以下内容包装所有现有路线:
Route::group(['middleware' => ['web']], function () {
// here your previous routes
});
修改强>
经过测试,我可以确认这种行为。
在这些情况下:
升级到5.2后,用户似乎不再被记录。进入5.1版本的分支时,用户会保持记录状态。当从5.2返回到5.1时,再次记录用户。
目前你应该在这里创建问题https://github.com/laravel/framework/issues并等待回复
<强> EDIT2 强>
这似乎是官方和预期的行为,因为已经添加了升级指南:
由于对身份验证系统进行了更改,因此升级到Laravel 5.2时,任何现有会话都将失效。