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.17 上)。切换分支后,我简单地运行composer install

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


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

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

4

2 回答 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));

此外,类名本身从 更改GuardSessionGuard

如果我将此方法替换为:

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

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

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

于 2016-01-04T00:42:53.150 回答
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 时,任何现有会话都将失效。

于 2015-12-25T09:24:41.883 回答