编程

在 Laravel 中使用 Mirror 包进行角色模拟

8 2025-12-25 23:22:00

Mirror 是一个优雅的 Laravel 用户模拟扩展包,它允许管理员以其他用户的身份登录,从而排查问题、提供支持并测试用户体验。安全的用户模拟对于生产应用至关重要,而 Mirror 提供加密验证来防止会话篡改。

它的工作原理是向 User 模型添加一个 Impersonatable trait 并实现两个方法。这两个方法定义了哪些角色可以进行模拟。

use Illuminate\Foundation\Auth\User as Authenticatable;
use Mirror\Concerns\Impersonatable;
 
class User extends Authenticatable
{
    use Impersonatable;
 
    public function canImpersonate(): bool
    {
        return $this->hasRole('admin');
    }
 
    public function canBeImpersonated(): bool
    {
        return ! $this->hasRole('super-admin');
    }
}

从那里,你可以使用该软件包的 Mirror facade 来开始和停止模拟身份:

use Mirror\Facades\Mirror;
 
// Start impersonating a user
Mirror::start($user);
redirect()->route('dashboard');
 
// Stop impersonating
Mirror::stop();
redirect()->route('admin.users.index');

该软件包还包含用于检查模拟状态、事件、Blade 指令等的方法:

@impersonating
    <div class="alert">
        You're impersonating {{ auth()->user()->name }}.
        <a href="{{ route('impersonation.leave') }}">Exit</a>
    </div>
@endimpersonating
 
{{-- Check specific guard --}}
@impersonating('admin')
    <div>Impersonating via admin guard</div>
@endimpersonating

主要特性

  • HMAC-SHA256 会话完整性保护,防止篡改
  • 可配置的 TTL 过期时间
  • 用于访问控制和 TTL 强制执行的中间件
  • 多重防护支持
  • 灵活的 URL 重定向
  • 用于审计日志记录的生命周期事件

要在 Laravel 项目中使用此软件包,你可以通过 Composer 安装它并发布软件包的配置选项:

composer require franbarbalopez/mirror
 
php artisan vendor:publish --tag=mirror