Как указать защиту авторизации при использовании нескольких охранников с Sanctum
Преамбула
Laravel Sanctum — это решение для аутентификации API на основе токенов и аутентификации SPA (одностраничное приложение). Он использует защиту аутентификации при выполнении аутентификации SPA.
По умолчанию используется защита web согласно файлу конфигурации. Тот же сторож используется и в аутентификации запроса Laravel по умолчанию.
Если в вашем веб-приложении есть несколько panels (скажем, администратор, менеджер, клиент и т. д.), вы будете использовать несколько средств проверки подлинности. И есть способ указать защиту промежуточного программного обеспечения аутентификации, например:
Route::get('/setup', function () {
// Only the users authenticated via the admin guard can visit this page.
})->middleware('auth:admin');
Но в случае со Санктумом нет возможности указать охрану. Само слово sanctum используется вместо имени охранника:
Route::get('/setup', function () {
// The default `web` guard is used. There is no option to specify any other guard name here.
})->middleware('auth:sanctum');
Как тогда мы используем охрану не по умолчанию? Многие разработчики сталкивались с этой проблемой. Давайте решим это.
Решение
Шаг 1. Создайте промежуточное ПО
Мы создадим новое промежуточное программное обеспечение, которое установит для нас защиту аутентификации на основе URL-адреса. Назовем его SetSanctumGuard:
<?php
declare(strict_types=1);
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Str;
class SetSanctumGuard
{
public function handle($request, Closure $next)
{
if (Str::startsWith($request->getRequestUri(), '/api/admin/')) {
config(['sanctum.guard' => 'admin']);
} elseif (Str::startsWith($request->getRequestUri(), '/api/manager/')) {
config(['sanctum.guard' => 'manager']);
} elseif (Str::startsWith($request->getRequestUri(), '/api/customer/')) {
config(['sanctum.guard' => 'customer']);
}
return $next($request);
}
}
Предполагая, что наше веб-приложение следует этому шаблону в конечных точках API, мы можем динамически определять защиту авторизации внутри промежуточного программного обеспечения. Или вы можете попробовать любой другой способ в соответствии со сценарием вашего веб-приложения, чтобы определить защиту.
Шаг 2. Включите промежуточное ПО
Существует несколько способов указать промежуточное ПО. В этом случае мы можем просто добавить его в массив api внутри файла app/Http/Kernel.php.
protected $middlewareGroups = [
'web' => [
// ...
],
'api' => [
\App\Http\Middleware\SetSanctumGuard::class,
// ...
],
];
Шаг 3. Добавьте примечание в файл конфигурации (необязательно)
Чтобы гарантировать, что никто из членов команды (и даже вы сами) не получите сюрпризов в будущем, рекомендуется отметить это в файле config/sanctum.php. Я делаю это так:
return [
'guard' => '', // This is set by the `SetSanctumGuard` middleware
//...
];
И при этом ваше веб-приложение должно использовать соответствующую защиту авторизации для защиты маршрутов в соответствии с типом пользователя.
Ваше здоровье
Я надеюсь, что Sanctum позволит эту настройку в ближайшем будущем. И нам не нужно будет создавать собственное промежуточное ПО для этого варианта использования.
А пока наслаждайтесь этим быстрым лайфхаком и создавайте мощные веб-приложения Laravel. Веселиться!
Первоначально опубликовано на https://blog.freshbits.in.
Подпишитесь на нашу Бесплатную еженедельную рассылку новостей. Свежий контент от разработчиков со всего мира, свежий и прямо с поля! Не забудьте подписаться на нашу публикацию The Dev Project.