ukeloop / laravel-impersonatable-guard
Laravel Impersonatable Guard 为 Laravel 应用程序提供增强安全特性的无缝用户假扮功能。
Requires
- php: ^8.1
- illuminate/auth: ^10.0|^11.0
- illuminate/contracts: ^10.0|^11.0
- illuminate/http: ^10.0|^11.0
- illuminate/queue: ^10.0|^11.0
- illuminate/support: ^10.0|^11.0
Requires (Dev)
- larastan/larastan: ^2.0
- laravel/pint: ^1.13
- orchestra/testbench: ^8.8|^9.0
README
这是一个用于处理用户假扮的 Laravel 守卫实现。它扩展了 Laravel 的 SessionGuard
并提供了额外的与假扮相关的方法。
用户假扮是一个功能,允许管理员或特权用户在应用程序中临时假定其他用户的身份。这种能力对于故障排除、测试特定于用户的功能或提供支持非常有价值。
此外,它支持多个身份验证守卫。例如,管理员守卫用户也可以假扮网络守卫用户。
安全考虑
用户假扮应谨慎使用,尤其是在生产环境中。在允许用户假扮他人之前,正确验证和授权用户非常重要。此外,在假扮模式下,应保护敏感操作或页面免受访问,以防止未经授权的使用。
安装
您可以通过 Composer 安装此包
composer require ukeloop/laravel-impersonatable-guard
配置
更新您的身份验证配置以使用 ImpersonatableSessionGuard
而不是 Laravel 的默认 SessionGuard
。您需要将驱动程序从 session
更改为 impersonatable.session
// config/auth.php 'guards' => [ 'web' => [ 'driver' => 'impersonatable.session', 'provider' => 'users', ], ],
用法
假扮用户
开始假扮指定的用户。此方法接受一个表示要假扮的用户实例的 Illuminate\Contracts\Auth\Authenticatable
。
Auth::guard('web')->impersonate($user);
一旦假扮用户
临时假扮指定的用户以单个请求。此方法对于需要作为另一个用户执行的操作非常有用,而不需要永久切换用户上下文。
Auth::guard('web')->onceImpersonate($user);
退出假扮
停止假扮当前用户并返回到原始用户上下文。
Auth::guard('web')->exitImpersonation();
获取原始用户
获取正在被假扮的原始用户。
$originalUser = Auth::guard('web')->originalUser();
检查当前假扮状态
检查守卫是否当前处于假扮状态。
$isImpersonated = Auth::guard('web')->impersonated();
使用中间件保护假扮
您可以使用中间件 impersonation.protect
来保护您的路由免受用户假扮的影响。此中间件确保用户在假扮其他用户时无法访问某些路由。
Route::get('/protect-form-impersonation', 'ExampleController@handleImportantRequest')->middleware('impersonation.protect');
使用指定的守卫保护
Route::get('/protect-form-impersonation', 'ExampleController@handleImportantRequest')->middleware('impersonation.protect:specified-guard');
示例假扮控制器
用于假扮用户的示例控制器
use App\Models\User; use Illuminate\Http\RedirectResponse; use Illuminate\Support\Facades\Auth; use RuntimeException; use Ukeloop\ImpersonatableGuard\Contracts\ImpersonatableGuard; class ImpersonationController extends Controller { /** * Start impersonating the specified user. */ public function impersonate(User $user): RedirectResponse { $guard = Auth::guard('web'); if (!$guard instanceof ImpersonatableGuard) { throw new RuntimeException('This guard is not allowed to impersonate.'); } $guard->impersonate($user); return redirect('/'); } /** * Stop impersonating the current user and return to the original user context. */ public function exit(): RedirectResponse { $guard = Auth::guard('web'); if (!$guard instanceof ImpersonatableGuard) { throw new RuntimeException('This guard is not allowed to impersonate.'); } $guard->exitImpersonation(); return redirect('/'); } }
自定义假扮守卫
您可以通过实现 Ukeloop\ImpersonatableGuard\Contracts\ImpersonatableGuard
来创建自定义假扮守卫。
use Ukeloop\ImpersonatableGuard\Contracts\ImpersonatableGuard; class CustomImpersonateGuard implements ImpersonatableGuard { // Define your own logic }