Laravel-速率限制器未绑定到用户

问题描述 投票:0回答:1

如果我这么说,我遇到了一个很奇怪的问题,一个API的用户报告说超出了API的速率限制,在检查时似乎没有将速率限制绑定到特定用户,而不是一次覆盖所有用户。

因此,当用户1发出请求时,其他用户的速率限制也会降低。

我已经使用Postman进行了测试,同时使用了两个单独的Bearer令牌(为两个唯一用户生成)

有人有想法吗?

laravel oauth-2.0
1个回答
0
投票

Laravel内置的节流中间件将限制基于用户的IP地址。

请参阅https://github.com/illuminate/routing/blob/master/Middleware/ThrottleRequests.php

protected function resolveRequestSignature($request)
    {
        if ($user = $request->user()) {
            return sha1($user->getAuthIdentifier());
        }

        if ($route = $request->route()) {
            return sha1($route->getDomain().'|'.$request->ip());
        }

        throw new RuntimeException('Unable to generate the request signature. Route unavailable.');
    }

这将解释为什么您在本地测试中看到了局限性。根据最终用户的用例,它也可能会解释一些问题。一个或多个人是否使用不同的用户名但从同一物理位置对其进行测试?

如果您考虑这样的节气门的目标,这是很有意义的。当同一最终用户开始使用新用户名尝试登录时,节流阀重新开始的用例仅在测试场景中才有意义。

如果您确实想改变此行为,则可以在文件夹app/Http/Middleware中制作一个新的自定义中间件,该文件夹扩展了基础Illuminate\Routing\Middleware\ThrottleRequests

然后在自定义中间件中,您可以覆盖方法resolveRequestSignature(),并将其从ip更改为其他名称。

您没有经过验证的用户可以使用,因此您的选择受到限制。

[如果您有用户传递api密钥标头,则这是一个合理的选择。根据您的设置方式,它看起来像这样:

<?php

namespace App\Http\Middleware;

use Illuminate\Routing\Middleware\ThrottleRequests;

/**
 * Class ApiKeyBasedThrottleRequests  
 *  
 * 
 *
 * @package App\Http\Middleware
 */
class SessionBasedThrottleRequests extends ThrottleRequests
{
    /**
     * Override the default, which returns as signature
     * sha1($route->getDomain().'|'.$request->ip());
     *
     * Resolve request signature.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return string
     *
     * @throws \RuntimeException
     */
    protected function resolveRequestSignature($request)
    {
        if ($user = $request->user()) {
            return sha1($user->getAuthIdentifier());
        }

        if ($route = $request->route()) {
            return sha1($route->getDomain().'|'. $request->header('api-key'));
        }

        throw new RuntimeException('Unable to generate the request signature. Route unavailable.');
    }
}

然后您将需要更新数组app/Http/Kernel中文件$routeMiddleware中对中间件的引用。更改分配给键throttle的值,使其指向新的自定义中间件,如果App\Http\Middleware;\ApiKeyBasedThrottleRequests::class

,则指向\Illuminate\Routing\Middleware\ThrottleRequests::class

如果您没有可使用的api密钥,您还可以考虑会话ID,但是如果单个用户尝试从同一浏览器会话中使用不同的用户名,您仍然会遇到相同的问题。在这种情况下,您可以建议用户重新启动浏览器,然后重试。但是,这基本上为节气门的目的创建了一种解决方法。

请仔细考虑并谨慎对待您的处理方式。使事情变得灵活以便您不阻止用户是有意义的,但是请记住,限制的目的之一是阻止潜在的恶意用户遭受暴力攻击,以发现有效的用户名/密码组合。您在这里所做的任何事情都可能会给他们一个潜在的解决方法。

© www.soinside.com 2019 - 2024. All rights reserved.