首页 文章

升级到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,
    ],
],

我的_v SESSION_DRIVERredis . 我没有从Redis那里得到什么 . (注意,这也发生在我的其他驱动程序为 file 的项目中,但我并不关心它们 . )

我有两个分支,L5.2和master(在5.1.17上) . 切换分支后,我只需运行 composer install

如果我登录主机,然后切换到L5.2,我退出如果我切换回主机,我重新登录如果我登录L5.2,然后切换到主机,我保持登录如果我切换回到L5.2,我保持登录状态

如果它会使我的所有用户的会话无效并迫使他们再次登录,我对升级犹豫不决 . 有办法避免这种情况吗?

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

2 回答

  • 1

    我弄清楚是什么导致会话失效 . 问题是会话守卫的 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');
    

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

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

  • 2

    你应该做的就是打开 app/Http/routes.php

    并使用以下内容包装所有现有路线:

    Route::group(['middleware' => ['web']], function () {
        // here your previous routes
    });
    

    EDIT

    经过测试,我可以确认这种行为 .

    在这些情况下:

    • 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时,任何现有会话都将失效 .

相关问题