Laravel Sanctumのカスタム認証ガード


サンクチュアリで複数の警備員を使用するとき、Auth Hardを指定する方法

前書き


Laravel Sanctum トークンベースのAPI認証とSPA(単一ページアプリケーション)認証のためのソリューションへの試みです.SPA認証を実行する際に認証ガードを使用します.
デフォルトではweb ガードはconfiguration file . デフォルトガードでは同じガードが使用されますrequest authentication 同様に.
あなたのウェブアプリが複数あるならばpanels (例えば、管理者、マネージャー、顧客など)、複数の認証ガードを使用します.Authミドルウェアにガードを指定する方法があります.
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');
どうやって非デフォルトガードを使うのですか?Many developers have この問題に直面している.それを解決しましょう.

解決策


Step 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);
    }
}
私たちのWebアプリがAPIエンドポイントのこのパターンに続くと仮定すると、我々はダイナミックにミドルガードの内部でAuthガードを決定することができます.またはあなたのWebアプリケーションのシナリオとしてガードを決定する他の方法を試すことができます.
ステップ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

    //...
];
そして、これで、あなたのウェブアプリはユーザータイプに従ってルートを保護するためにそれぞれのAuth Guardを使用しなければなりません.

歓声


閉じるこの動画はお気に入りから削除されています.そして、このユースケースのカスタムミドルウェアを作成する必要はありません.
それまでは、この迅速なハックを楽しむし、強力なララベルWebアプリケーションを構築します.楽しい!
の写真ですGlenn Carstens-Peters on Unsplash