Laravel Impersonate — Как выдавать себя за других пользователей

Одной из интересных особенностей Laravel Nova является возможность выдавать себя за пользователя прямо из панели управления. Это удобно по многим причинам, но я считаю, что когда вы получаете сообщение об ошибке или проблеме и хотите увидеть, что именно видит пользователь, выдача себя за него экономит массу времени, поскольку вы можете увидеть именно то, что видит пользователь.

Если вы хотите настроить эту функцию в своём Laravel приложении, то пакет Laravel Impersonate позволяет сделать это очень просто. Вот как начать работу.

Шаг 1. Требования и настройка пакета

Как и для всех других пакетов, требуется composer:

composer require lab404/laravel-impersonate

Далее откройте файл config/app.php и добавьте его в массив providers:

'providers' => [
// ...
Lab404\Impersonate\ImpersonateServiceProvider::class,
],

После этого откройте Models/User и добавьте трейт:

use Lab404\Impersonate\Models\Impersonate;

class User extends Authenticatable
{
use Impersonate;

Шаг 2. Маршруты имперсонации

Пакет Laravel Impersonate включает в себя несколько способов имперсонации пользователя, но мне показалось, что проще всего использовать их макрос routes, добавив его в файл routes/web.php.

Route::impersonate();

Это позволяет получить несколько именных маршрутов:

// Где $id - идентификатор пользователя, за которого вы хотите себя выдать.
route('impersonate', $id)

// Или в случае нескольких "охранников" необходимо также добавить `guardName` (по умолчанию `web`).
route('impersonate', ['id' => $id, 'guardName' => 'admin'])

// Генерирование URL-адреса для выхода из текущего пользователя
route('impersonate.leave')

Шаг 3. Использование имперсонации в Laravel Blade

Теперь, когда все настройки Laravel Impersonate выполнены, можно использовать несколько хелперов для Blade:

@canImpersonate($guard = null)
<a href="{{ route('impersonate', $user->id) }}">Impersonate this user</a>
@endCanImpersonate

Затем — обратное:

@impersonating($guard = null)
<a href="{{ route('impersonate.leave') }}">Leave impersonation</a>
@endImpersonating

Шаг 4. Расширенная настройка

Ещё один момент, который вы, возможно, захотите рассмотреть, — это настройка опций для ограничения того, кто может выдавать себя за других пользователей, и того, за каких пользователей можно выдавать себя. В разделе Models/User можно добавить следующие методы:

/**
* По умолчанию все пользователи могут выдавать себя за кого угодно,
* в данном примере это ограничено тем, что только администраторы
* могут выдавать себя за других пользователей
*/

public function canImpersonate(): bool
{
return $this->is_admin();
}

/**
* По умолчанию все пользователи могут выдавать себя за других,
* это ограничивает эту возможность только определёнными пользователями.
*/

public function canBeImpersonated(): bool
{
return ! $this->is_admin();
}

Использование имперсонации в Laravel Jetstream

При использовании этого пакета в продакшне с Laravel Jetstream я столкнулся с проблемой, когда он работал нерегулярно, и если вы столкнулись с этой проблемой, попробуйте добавить эту рекомендацию в ваш EventServiceProvider:

public function boot()
{
Event::listen(function (TakeImpersonation $event) {
session()->put([
'password_hash_sanctum' => $event->impersonated->getAuthPassword(),
]);
});

Event::listen(function (LeaveImpersonation $event) {
session()->remove('password_hash_web');
session()->put([
'password_hash_sanctum' => $event->impersonator->getAuthPassword(),
]);
Auth::setUser($event->impersonator);
});
}

Заключение

В целом, пакет Laravel Impersonate включает в себя все необходимое для удобного входа в систему под именем других пользователей и представляет простой способ добавления этой функции в ваше приложение. Если вы хотите узнать больше о пакете и его расширенных возможностях, ознакомьтесь с пакетом, а в файле readme.md вы найдёте более подробную информацию.

Дополнительные материалы

Предыдущая Статья

События в Laravel

Следующая Статья

Новое в Symfony 6.4: DatePoint