如何根据 sanctum auth 中间件故障为同一路由调用不同的函数?

Posted

技术标签:

【中文标题】如何根据 sanctum auth 中间件故障为同一路由调用不同的函数?【英文标题】:How to call different functions for same route based on sanctum auth middleware failure? 【发布时间】:2021-09-26 22:10:30 【问题描述】:

我有路线

/** PROTECTED ROUTES */
Route::group(['middleware' => ['auth:sanctum']], function () 
    Route::post('/cart/add-product', [CartController::class, 'addProductToCart']);
);

如果用户已通过身份验证,则此路线应将产品添加到 UserCart,即我们可以在 $request->user() 的帮助下获取 user_id。 如果用户未通过身份验证,前端将提供唯一的 user_id。 基于此,我希望路线保持不变,但调用的函数应该不同,这样,如果用户通过身份验证,产品将被添加到他们的 UserCart 中,否则它将被添加到他们的 TemporaryCart

【问题讨论】:

听起来您应该从路由中删除中间件(因为您希望路由无论如何都可以工作)并让控制器检查用户是否经过身份验证。然后控制器可以确定应该如何处理请求(例如,应该在哪里以及如何保存它)。 @MagnusEriksson 感谢您的回复。如果请求已通过身份验证,我如何签入控制器。如果我删除中间件,$request->user() 不会返回用户。那么如何从请求中获取用户呢? 【参考方案1】:

只需删除中间件并在控制器中检查它。控制器应该做什么是正确的:)

只是一点点改进,你可以这样做:

Route::post('/cart/add-product', 'CartController@addProductToCart');

在你的控制器中你可以有这样的东西。 (不要抄袭它只是为了灵感)

public function addProductToCart(Request $request, $id) 
   if (!empty($id)) 
      return $this->handleNewUser();
   else
      return $this->handleAuthUser();


private function handleNewUser() 
   //add to temporary cart


private function handleAuthUser() 
   //add to users cart

【讨论】:

感谢您的回复。我不知道如何从请求中获取经过身份验证的用户实例? 在您的控制器顶部使用:use Illuminate\Support\Facades\Auth 然后在您的函数中Auth::user() 将返回身份验证用户的实例:) 它不起作用。 Auth::user() 返回 null,即使我提供不记名令牌

以上是关于如何根据 sanctum auth 中间件故障为同一路由调用不同的函数?的主要内容,如果未能解决你的问题,请参考以下文章

我需要将基本身份验证添加到我的 sanctum api

Laravel auth vs Passport vs Sanctum

Laravel Sanctum:被带有 Nuxt Auth 模块的 CORS 策略阻止

如何使用 CSRF 令牌测试 Laravel / Sanctum 端点

Laravel 8 Sanctum SPA Auth - 未按要求设置会话存储

Laravel sanctum 检查用户是不是在没有重定向的情况下通过身份验证