Laravel 中用户模拟的完整指南

admin 2023-12-29 44 阅读 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() 方法清除会话,以删除对存储的模仿者身份的任何引用。

发表评论

快捷回复: 表情:
Addoil Applause Badlaugh Bomb Coffee Fabulous Facepalm Feces Frown Heyha Insidious KeepFighting NoProb PigHead Shocked Sinistersmile Slap Social Sweat Tolaugh Watermelon Witty Wow Yeah Yellowdog
提交
评论列表 (有 0 条评论, 44人围观)