Laravel 中间件无法按预期工作

Posted

技术标签:

【中文标题】Laravel 中间件无法按预期工作【英文标题】:Laravel middleware doesn't work as expected 【发布时间】:2021-11-24 04:07:44 【问题描述】:

我使用 Laravel 8 作为后端,使用 Angular 11 作为前端。在使用 url 购买后,我想通过前端的 API 将三个参数传递给 Laravel。这将如下所示:.../user_id/$track_id/$price_id。 我不知道这是否是确认购买的最佳方式,但不幸的是,即使经过大量研究,我也不知道其他任何方式。唯一的问题是它非常容易受到攻击,并且可以写任何数字,例如邮递员,因此产品最终会出现在他们的帐户中。

现在我在我的 api.php 中尝试了:

Route::post('addTrackusers/user_id/track_id/track_pice', 'App\Http\Controllers\trackusersController@addTrackusers')->middleware(['auth:api', Payout::class]);

在这条路线的帮助下,我得到了所需的三个参数。然而,在那之后,我想使用中间件来防止未经授权的用户传递任何没有购买任何东西的参数:

中间件/Payout.php

    public function handle($request, Closure $next)
    
        $user = auth()->user();
        if ($request->id != $user->id) 
            abort(403, 'Unauthorized action');
         else 
            return $next($request);
        
    

我真的不知道如何解决这个问题。我的想法是传递三个参数并比较它们是否属于当前用户。

但当前用户也可以只在 Postman 中输入他的令牌,然后他将被授权传递三个参数。我真的很感激任何建议或如何最好地解决这个问题。

非常感谢!

【问题讨论】:

【参考方案1】:

这应该可行:

public function handle($request, Closure $next)
    

        if ($request->user_id !== auth()->user()->id) 
            abort(403, 'Unauthorized action');
        
        
        return $next($request); 
    

在你的 url 中,你没有 $id,但是有 $user_id

【讨论】:

哦,我什至没有注意到,非常感谢!现在它起作用了!您认为以这种方式处理购买流程是个好主意吗?我注意到它很容易受到攻击,并且该路由可以被当前登录的用户利用,因为他们只需要输入他们的令牌。 你应该考虑使用 laravel sanctum 或 laravel 护照。您可以为用户或某个组或角色生成具有范围的令牌。 为什么需要通过url传递user_id?而track_id和track_price的含义是什么? 我明白了,谢谢你的建议。 user_id 我想传递当前登录的用户,track_id 是用户购买的产品 ID,track_price 应该代表购买产品的价格。但我认为这是非常不必要的,尤其是非常脆弱。 我还没有找到另一种方法来告诉我的后端购买了哪些商品、以什么价格以及由谁购买。

以上是关于Laravel 中间件无法按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose pre.save() 异步中间件未按预期工作

Mongoose pre.save() 异步中间件未按预期工作

Laravel Route::group[] 无法正常工作

Laravel CORS 问题

laravel 会话刷新和忘记方法无法按预期工作

Laravel 5.2 会话闪存即使使用 Web 中间件也无法正常工作