【问题标题】:Redundant Database Query using JWTAuth and Laravel使用 JWTAuth 和 Laravel 进行冗余数据库查询
【发布时间】:2018-02-14 06:51:12
【问题描述】:

使用JWTAuth 时,发送到API 的每个签名 请求都会执行检索用户的数据库查询,即:

select * from `users` where `id` = '1' limit 1

对于我的大多数路线,此查询是多余的,我想将其删除。在this pull request 中有关于这个话题的讨论。虽然,我已经在使用自定义中间件,但我想 JWTAuth 提供的那个仍然存在。

如何删除多余的用户数据库查询?

【问题讨论】:

    标签: laravel jwt


    【解决方案1】:

    导致此行为的中间件是 ThrottleRequests,在 \Illuminate\Routing\Middleware\ThrottleRequests 中更明确地是 resolveMaxAttempts()resolveRequestSignature()。这两个函数都在执行$request->user()

    这是由包含默认 api 中间件组的protected $middlewareGroups 继承的:

    'api' => [
        'throttle:60,1',
        'bindings',
    ]
    

    【讨论】:

      【解决方案2】:

      正如我可以从您引用的那个 pull 的 cmets 中看到的,您必须创建自定义中间件并使用 check 函数检查令牌是否有效,这意味着您还需要在用户登录时手动验证用户身份你的申请

      通过使用 check() 和 checkOrFail()

      是的,我肯定会推荐添加您自己的中间件。

      因此,如果您不想不必要地查询数据库,则需要手动 Authenticatecheck 验证令牌的有效性。

      【讨论】:

      • 正如我所写,我确实有一个自定义中间件,但查询仍在被触发。
      • 你能从你的中间件中包含你的代码,还包括你的api.php
      • api.php 文件只包含路由,例如:Route::post('/search', 'SearchController@index');。对于那条路线,除了RouteServiceProvider.api 提供的默认api 中间件之外,我没有使用任何中间件。
      • 您能否确认sql 是在您的middleware 执行后被触发,还是在controller 中的其他位置被触发?
      • 我正在使用 Laravel 调试栏,这表明正在触发查询。它没有确切说明什么时候。
      猜你喜欢
      • 2019-03-29
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多