ukeloop/laravel-impersonatable-guard

Laravel Impersonatable Guard 为 Laravel 应用程序提供增强安全特性的无缝用户假扮功能。

v1.1.0 2024-09-02 16:10 UTC

This package is auto-updated.

Last update: 2024-10-02 16:24:35 UTC


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
}