如何根据 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 中间件故障为同一路由调用不同的函数?的主要内容,如果未能解决你的问题,请参考以下文章
Laravel auth vs Passport vs Sanctum
Laravel Sanctum:被带有 Nuxt Auth 模块的 CORS 策略阻止
如何使用 CSRF 令牌测试 Laravel / Sanctum 端点