Laravel 中用户模拟的完整指南

admin 2023-12-29 527 阅读 0评论

在现实世界中,冒充通常与身份盗窃或犯罪行为有关。然而,在 QA 和应用程序测试领域,冒充是一种有效的工具,可用于避免重复登录多个用户帐户以测试功能或提供客户支持。

本文将深入探讨如何将模拟功能合并到您的应用程序中。模拟可以帮助管理员管理其他用户行为,并确保应用程序在各种情况下都能正常运行。

要实现用户切换,我们需要安装一个 Composer 软件包,该软件包将有助于有效管理会话。

composer require lab404/laravel-impersonate

安装后,我们需要在 config/app.php 文件中注册提供程序:

Lab404\Impersonate\ImpersonateServiceProvider::class,class,

接下来,我们需要编写一个函数,负责捕获当前用户并将其存储在会话中。这有助于在模拟帐户中完成任务后无缝过渡回原始用户帐户。

public function impersonate($userId)
{
  // 获取要模拟的用户
  $user = $this->userRepository->find($userId);

  // 捕获当前用户
  $adminUser = auth()->user();

  // 将当前用户存储在会话中
  $session = $request->session();
  $session->put('isAdmin'true);
  $session->put('adminUserId'$adminUser->id);

  // 开始模拟
  app('impersonate')->take($adminUser$user);

  // 将用户 ID 设置为模拟用户的 ID
  $request->setUserResolver(fn () => $user);
}

以下是使用该函数的示例:

Route::get('/impersonate'function () {
  // 获取要模拟的用户 ID
  $userId = request()->user_id;

  // 开始模拟
  $this->impersonate($userId);

  // ... 执行模拟操作 ...

  // 结束模拟
  $this->impersonate(null);

  return view('home');
});

该路由首先获取要模拟的用户 ID,然后调用 impersonate() 函数开始模拟。在模拟操作完成后,它再次调用 impersonate() 函数结束模拟。

Laravel Impersonate 包提供了一些 API 来在模拟者和被模拟用户之间切换会话。

  • leave() 函数用于从正在进行的会话中删除当前用户。这会导致会话行为发生变化,例如,如果当前用户是管理员,则管理员权限将被禁用。
  • take($adminUser, $user) 方法将管理员用户的会话替换为当前模拟的用户帐户。这会导致会话上下文发生变化,例如,当前用户将拥有被模拟用户的权限。
  • $request->setUserResolver(fn () => $user) 方法将当前用户与应用程序内发出的每个请求绑定。这会导致应用程序始终使用当前用户来处理请求。

例如:

// 退出当前模拟
$manager->leave();

// 以管理员用户的身份模拟用户
$manager->take($adminUser$user);

// 将当前用户与请求绑定
$request->setUserResolver(fn () => $user);

在代码的后一部分中,冒充者将恢复到他们的原始帐户。这意味着存储在会话中的用户 ID 将用于重新获得对应用程序的真实访问权限。

// 获取存储在会话中的用户 ID
$userId = $request->session()->get('adminUserId');

// 如果用户 ID 不为空
if (!empty($userId)) {
  // 获取当前用户
  $manager = app('impersonate');
  $user = $manager->findUserById($userId);

  // 退出当前模拟
  $manager->leave();

  // 以当前用户的身份模拟用户
  $manager->take(auth()->user, $user);

  // 将当前用户与请求绑定
  $request->setUserResolver(fn () => $user);

  // 清除会话以删除对存储的模仿者身份的任何引用
  $request->session()->forget(['adminUserId''isAdmin']);
}

这段代码首先获取存储在会话中的用户 ID。如果用户 ID 不为空,则说明当前用户正在模拟另一个用户。

代码创建一个 Impersonate 实例并获取当前用户。然后,它调用 leave() 方法退出当前模拟。

最后,代码调用 take() 方法将当前用户重新设置为被模拟用户。它还调用 setUserResolver() 方法将当前用户与请求绑定。最后,它调用 forget() 方法清除会话,以删除对存储的模仿者身份的任何引用。

喜欢就支持以下吧
点赞 0

发表评论

快捷回复: 表情:
aoman baiyan bishi bizui cahan ciya dabing daku deyi doge fadai fanu fendou ganga guzhang haixiu hanxiao zuohengheng zhuakuang zhouma zhemo zhayanjian zaijian yun youhengheng yiwen yinxian xu xieyanxiao xiaoku xiaojiujie xia wunai wozuimei weixiao weiqu tuosai tu touxiao tiaopi shui se saorao qiudale qinqin qiaoda piezui penxue nanguo liulei liuhan lenghan leiben kun kuaikule ku koubi kelian keai jingya jingxi jingkong jie huaixiao haqian aini OK qiang quantou shengli woshou gouyin baoquan aixin bangbangtang xiaoyanger xigua hexie pijiu lanqiu juhua hecai haobang caidao baojin chi dan kulou shuai shouqiang yangtuo youling
提交
评论列表 (有 0 条评论, 527人围观)

最近发表

热门文章

最新留言

热门推荐

标签列表