支持Laravel.io的持续发展 →

在Laravel Sanctum中自定义认证守卫

1Apr,2022 3分钟阅读 1,306次观看

在使用多个守卫时如何指定Sanctum的认证守卫

前言

Laravel Sanctum是针对基于令牌的API身份验证和SPA(单页应用程序)身份验证的首选解决方案。它在进行SPA身份验证时使用认证守卫。

默认情况下,使用配置文件中的设置,使用web守卫。同样的守卫也在默认的Laravel 请求身份验证中使用了。

如果你的Web应用程序有多个面板(例如,管理员、经理、客户等),你会使用多个认证守卫。有一种方法可以指定给认证中间件,比如

Route::get('/setup', function () {
    // Only the users authenticated via the admin guard can visit this page.
})->middleware('auth:admin');

但是在Sanctum的情况下,没有指定守卫的方法。单词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);
    }
}

假设我们的Web应用程序遵循此模式在API端点,我们可以在中间件中动态决定认证守卫。或者,你可以根据你的Web应用程序场景尝试其他方式来决定守卫。

步骤2:启用中间件

指定中间件的几种方法。在这种情况下,我们可以简单地在文件app/Http/Kernel.php中的api数组中添加它。

protected $middlewareGroups = [
    'web' => [
        // ...
    ],

    'api' => [
        \App\Http\Middleware\SetSanctumGuard::class,
        // ...
    ],
];

第3步:在配置文件中添加注释(可选)

为了确保团队成员(甚至你自己)在未来不会收到意外,建议在config/sanctum.php文件中记录下来。我通常这样做:

return [
    'guard' => '', // This is set by the `SetSanctumGuard` middleware

    //...
];

使用这种方法,你的Web应用应该能够根据用户类型使用相应的认证保护器来保护路由。

干杯!

希望Sanctum能在不久的将来支持这种自定义。这样我们就无需为这种情况创建自定义中间件。

直到那时,享受这个快速技巧,并构建强大的Laravel Web应用。祝你好运!

上次更新时间:1年前。

driesvints, mrgiant, gauravmak 喜欢这篇文章

3
喜欢这篇文章吗?让作者知道,给他们点个赞!
gauravmak (Gaurav Makhecha) 全职自由职业者 | Laravel、Vue.js 粉丝 | 分享社区更新以及我在自由职业、生产力以及其中事物上的心得体会

你可能还喜欢其他文章

2024年3月11日

如何使用Larastan将你的Laravel应用从0到9进行优化

在Laravel应用执行前找到错误是可能的,多亏了Larastan,它...

阅读文章
2024年7月19日

无需使用特性标准化API响应

我发现,大多数用于API响应的库都使用特性实现,并且...

阅读文章
2024年7月17日

在Laravel项目中通过Discord通知收集反馈

如何在一个Laravel项目中创建一个反馈模块,并在收到消息时接收到Discord通知...

阅读文章

我们感谢这些 令人惊叹的公司 对我们的支持

您的标志在这里?

Laravel.io

laravel的解决问题的关键门户,知识共享和社区建设。

© 2024 Laravel.io - 所有权利保留。