从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那里清除任何东西。(请注意,这也发生在我的其他项目中,其中driver是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。
发布于 2016-01-04 08:42:53
我找出了导致会话无效的原因。问题出在会话保护的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');
可以让我的会话保持登录状态。
这是一个进步,但还不是一个完整的解决方案。真正的解决方案是使用新名称更新所有现有会话。我将编写一个脚本来完成此操作,然后更新我的答案。
发布于 2015-12-25 17:24:42
您应该做的是打开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时,任何现有会话都将失效。
https://stackoverflow.com/questions/34461284
复制相似问题