Laravel 7 loginUsingId 不持久/导致注销
Posted
技术标签:
【中文标题】Laravel 7 loginUsingId 不持久/导致注销【英文标题】:Laravel 7 loginUsingId not persisting / causing log out 【发布时间】:2021-01-20 09:17:30 【问题描述】:我正在尝试创建一个“影子”用户功能,它基本上只是允许管理员以另一个用户身份登录,以便像“影子用户”一样使用系统。
我以前使用过Auth::loginUsingId
,但我不知道为什么下面的方法不起作用。
public function shadowUser($id, Request $request)
$user = User::query()->find($id);
$previousUserId = $request->user()->id;
Session()->flush();
Session()->put('shadow.user.id', $previousUserId);
$shadowedUser = Auth::loginUsingId($user->id);
dump(Auth::check());
return redirect()->route('home');
如果我转储 $shadowedUser
,它会显示正确的用户,而 Auth::check()
返回 true。
我也尝试过这些,但它们没有区别:Auth::loginUsingId(1, true);
、Auth::guard($guard)->loginUsingId($user->ID);
和 Auth::login($user, true);
没有疯狂的中间件,只有 laravel 的默认值。
我尝试了一些方法,例如删除会话刷新,但它总是让我退出。
【问题讨论】:
如果你不想全部写出来,已经有一个方便的包可以做到这一点github.com/404labfr/laravel-impersonate 你应该试试Auth::loginUsingId(1, true);
或Auth::login($user, true);
@jewishmoses 我也试过了!我会把它添加到我的问题中!
查看现成的包,他们先注销当前用户,然后再登录影子用户。即使您不打算使用该软件包,您也可以检查它以了解它是如何完成的。带有您所追求的代码的文件是github.com/404labfr/laravel-impersonate/blob/master/src/… 函数称为take
@Rooneyl 我也尝试将当前用户注销,但没有任何区别。
【参考方案1】:
我发现 Laravel 会话在这种情况下有点时髦,看起来你试图在会话已经处于活动状态时登录某人,注销当前用户,刷新会话然后登录新用户,这样它会告诉 Laravel 这是一个新用户登录并重置会话。
在您的脚本中,一旦您将用户注销、刷新会话并登录新用户,请将以前的用户 ID 添加到新会话中,否则它将被删除,然后您将能够看到以前的用户 ID登录的用户,或者在这种情况下跟踪您的人。
public function shadowUser($id, Request $request)
$user = User::query()->find($id);
$previousUserId = $request->user()->id;
Auth::logout($guard);
Session()->flush();
Auth::loginUsingId($user->id);
Session()->put('shadow.user.id', $previousUserId);
dump(Auth::check());
return redirect()->route('home');
【讨论】:
这似乎在我取出转储后成功了!谢谢!以上是关于Laravel 7 loginUsingId 不持久/导致注销的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 Laravel 5 持久化 Auth::login