在 Laravel 中使用 Mirror 包进行角色模拟
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