【发布时间】:2018-02-14 06:51:12
【问题描述】:
使用JWTAuth 时,发送到API 的每个签名 请求都会执行检索用户的数据库查询,即:
select * from `users` where `id` = '1' limit 1
对于我的大多数路线,此查询是多余的,我想将其删除。在this pull request 中有关于这个话题的讨论。虽然,我已经在使用自定义中间件,但我想 JWTAuth 提供的那个仍然存在。
如何删除多余的用户数据库查询?
【问题讨论】:
使用JWTAuth 时,发送到API 的每个签名 请求都会执行检索用户的数据库查询,即:
select * from `users` where `id` = '1' limit 1
对于我的大多数路线,此查询是多余的,我想将其删除。在this pull request 中有关于这个话题的讨论。虽然,我已经在使用自定义中间件,但我想 JWTAuth 提供的那个仍然存在。
如何删除多余的用户数据库查询?
【问题讨论】:
导致此行为的中间件是 ThrottleRequests,在 \Illuminate\Routing\Middleware\ThrottleRequests 中更明确地是 resolveMaxAttempts() 和 resolveRequestSignature()。这两个函数都在执行$request->user()。
这是由包含默认 api 中间件组的protected $middlewareGroups 继承的:
'api' => [
'throttle:60,1',
'bindings',
]
【讨论】:
正如我可以从您引用的那个 pull 的 cmets 中看到的,您必须创建自定义中间件并使用 check 函数检查令牌是否有效,这意味着您还需要在用户登录时手动验证用户身份你的申请
通过使用 check() 和 checkOrFail()
是的,我肯定会推荐添加您自己的中间件。
因此,如果您不想不必要地查询数据库,则需要手动 Authenticate 和 check 验证令牌的有效性。
【讨论】:
api.php
api.php 文件只包含路由,例如:Route::post('/search', 'SearchController@index');。对于那条路线,除了RouteServiceProvider.api 提供的默认api 中间件之外,我没有使用任何中间件。
sql 是在您的middleware 执行后被触发,还是在controller 中的其他位置被触发?