升级到 Laravel 5.2 会使所有会话失效
Upgrading to Laravel 5.2 invalidates all sessions
正在从 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
If I login on master, then switch to L5.2, I am logged out
If I switch back to master, I am logged back in
If I login on L5.2, then switch to master, I stay logged in
If I switch back to L5.2, I stay logged in
如果升级会使我所有用户的会话失效并强制他们重新登录,我会犹豫是否升级。有没有办法避免这种情况?
唯一修改的其他文件是 composer.json
、composer.lock
、app/Exceptions/Handler.php
和 config/app.php
;没有触及 Auth.
你应该做的是打开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
这似乎是官方预期的行为,因为已添加升级指南:
Because of changes to the authentication system, any existing sessions will be invalidated when you upgrade to Laravel 5.2.
我找出导致会话无效的原因。问题是会话守卫的 getName()
方法。
在 5.1.17 中:
return 'login_'.md5(get_class($this));
在 5.2 中($this->name
默认为 web
):
return 'login_'.$this->name.'_'.sha1(get_class($this));
此外,class 名称本身从 Guard
更改为 SessionGuard
如果我将此方法替换为:
return 'login_'.md5('Illuminate\Auth\Guard');
这让我的会话保持登录状态。
这是一个进步,但还不是一个完整的解决方案。真正的解决方案是用新名称更新所有现有会话。我将编写脚本来完成此操作,然后更新我的答案。
正在从 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
If I login on master, then switch to L5.2, I am logged out
If I switch back to master, I am logged back in
If I login on L5.2, then switch to master, I stay logged in
If I switch back to L5.2, I stay logged in
如果升级会使我所有用户的会话失效并强制他们重新登录,我会犹豫是否升级。有没有办法避免这种情况?
唯一修改的其他文件是 composer.json
、composer.lock
、app/Exceptions/Handler.php
和 config/app.php
;没有触及 Auth.
你应该做的是打开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
这似乎是官方预期的行为,因为已添加升级指南:
Because of changes to the authentication system, any existing sessions will be invalidated when you upgrade to Laravel 5.2.
我找出导致会话无效的原因。问题是会话守卫的 getName()
方法。
在 5.1.17 中:
return 'login_'.md5(get_class($this));
在 5.2 中($this->name
默认为 web
):
return 'login_'.$this->name.'_'.sha1(get_class($this));
此外,class 名称本身从 Guard
更改为 SessionGuard
如果我将此方法替换为:
return 'login_'.md5('Illuminate\Auth\Guard');
这让我的会话保持登录状态。
这是一个进步,但还不是一个完整的解决方案。真正的解决方案是用新名称更新所有现有会话。我将编写脚本来完成此操作,然后更新我的答案。