Как указать защиту авторизации при использовании нескольких охранников с 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.