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

Auth 在 Laravel Tinker 中不起作用

121. 买卖股票的最佳时机

121. 买卖股票的最佳时机

从 Laravel 5.7.4 升级到 Laravel 8 的危险

在 Laravel 项目文件夹中将 PHP 7.3 升级到 7.4