Laravel 中用户模拟的完整指南
在现实世界中,冒充通常与身份盗窃或犯罪行为有关。然而,在 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()
方法清除会话,以删除对存储的模仿者身份的任何引用。
发表评论