gpt4 book ai didi

php - Laravel 5 : how to reset builtin throttle/ratelimiter?

转载 作者:行者123 更新时间:2023-12-03 17:33:39 24 4
gpt4 key购买 nike

我像这样使用 Laravel 的内置 throttle :

//File: Kernal
protected $middlewareGroups = [
'api' => ['throttle:10,3']
];

但是,我想在我的一个 Controller 中执行某些操作后重置计数(例如成功登录后)。

我可以看到这个中间件使用 RateLimiter并且有一个名为 clear 的公共(public)方法.

问题是,这个怎么用?因为它取决于 key来自 ThrottleRequests中间件。
  • 获取 objectThrottleRequests我需要 RateLimiter 的实例
  • 获取RateLimiter的对象,我需要 Cache 的实例.
    .
    .

  • 总而言之,如何使用它没有尽头..
    任何的想法?

    谢谢

    最佳答案

    由于您的问题使用 Laravel v5.5 标记,因此适用于此处:
    专门针对登录尝试:
    您可以use the Illuminate\Foundation\Auth\AuthenticatesUsers trait in your controller ,因此您可以访问 clearLoginAttempts 方法,它调用 clear() RateLimiter 上的方法实例具有正确的 key ,而无需提供 key 。
    实际上,如果您查看 Illuminate\Foundation\Auth\ThrottlesLogins::clearLoginAttempts()实现了,可以看到通过$this->throttleKey($request)可以检索到正确的key ,一旦您的 Controller 使用 AuthenticatesUsers特征。
    一般来说:
    你总是可以得到 Illuminate\Cache\RateLimiter 实例使用 app(\Illuminate\Cache\RateLimiter::class) ,这又将包含所有配置的限制器和缓存。问题是从这个角度来看是无法获取缓存键的。因此,您确实必须首先找出 key 的设置位置和方式,以便您可以使用相同的 key 进行重置。
    标准 ThrottleRequests 中间件在 handle() 中设置 key 方法,但实际的 key 将取决于您的 throttle 配置的位置和方式(例如:它是命名限制器还是仅使用数字参数设置,是 ->by(...) 调用它以显式设置 key 等)
    如果您只需要找到一个特定限制器的键,您可能可以在 handle() 中设置断点。方法,然后检查。
    你的情况
    在您的特定情况下,由于它不是命名限制器,handle()方法将调用 resolveRequestSignature 得到 key 。我认为您不能轻松地从 Controller 访问中间件实例。您可以做的是检查该方法如何生成 key 并基本上复制那段代码以复制相同的 key ,但我不建议这样做,因为它是一个肮脏和脆弱的解决方案。
    如果您检查,您会看到 key 可以复制为:

    if ($user = $request->user()) {
    $key = sha1($user->getAuthIdentifier());
    }
    elseif ($route = $request->route()) {
    $key = sha1($route->getDomain().'|'.$request->ip());
    }
    但是在最近的 Laravel 版本中,您可以显式设置 key ,这是更清洁和可靠的解决方案:

    在 Laravel 8 中
    现在这个问题已经相当老了,大多数人宁愿使用最新版本的 Laravel(2021 年 2 月 12 日的 v8),所以对他们来说 documentation includes the way to "segment" the limiters又名。能够根据请求(或 session 数据等)为不同的请求应用单独的限制计数器。事实上 by()方法实际上设置 key的限制器。因此,您可以设置一个或多个命名限制器,例如:
    RateLimiter::for('my_per_ip_limiter', function (Request $request) {
    return Limit::perMinute(100)->by($request->ip());
    });
    这意味着名为 my_per_ip_limiter 的限制器将使用 IP 作为 key ,因此您可以随时在 Controller 中调用:
    app(\Illuminate\Cache\RateLimiter::class)->clear($request->ip());
    重置特定 IP 的限制器。或获取到目前为止的尝试次数:
    $attempts_so_far = app(\Illuminate\Cache\RateLimiter::class)->attempts($request->ip());
    实际上,您可以使用请求(或 session 或其他)的任何变量来代替 IP。
    然而,没有办法(我认为)区分命名的限制器。因此,如果同一键也用于另一个限制器,则它们的命中将一起计算*并一起清除。所以给一个像 my_per_ip_limiter 这样的名字限制器仅有用,因此您可以按名称将该限制器分配给特定路线,例如:
    Route::post( 'login', 'Auth\LoginController@login' )
    ->middleware('throttle:my_per_ip_limiter');
    但是如果你真的需要命名限制器来单独重置,你必须使用一个唯一的键,例如在它前面加上一些东西,例如:
    RateLimiter::for('my_other_ip_limiter', function (Request $request) {
    return Limit::perMinute(100)->by('other_'.$request->ip());
    });
    这可以独立于另一个清除:
    // reset my_other_ip_limiter, but not my_per_ip_limiter :
    app(\Illuminate\Cache\RateLimiter::class)->clear('other_'.$request->ip());
    *:通过一起计数,我的意思是它们会相加,所以如果你将它们中的两个应用于同一个请求,每个请求都会使计数器增加 2!

    关于php - Laravel 5 : how to reset builtin throttle/ratelimiter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50126765/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com