在使用多个守卫时如何指定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应用。祝你好运!
driesvints, mrgiant, gauravmak 喜欢这篇文章