Symfony5: login throttling failure必须是一个RequestRateLimiterInt



为了满足安全审计,我需要实现一个功能,其中用户每5分钟最多可以有3次登录尝试

幸运的是,它现在是内置的Symfony 5.2: https://symfony.com/blog/new-in-symfony-5-2-login-throttling

由于参数max_attempts对我来说是不够的(它每1分钟),我想使用第二个选项来提供我的所有者限制器

所以我用https://symfony.com/blog/new-in-symfony-5-2-rate-limiter-component

我的配置是这样的

framework:
rate_limiter:
max_login_failure:
policy: fixed_window
limit: 3
interval: '10 minutes'
security:
firewalls:
admins:
host: admin.*
pattern: ^/
provider: admins
login_throttling:
limiter: limiter.max_login_failure

但是失败了,报错

Argument 2 passed to SymfonyComponentSecurityHttpEventListenerLoginThrottlingListener::__construct() must be an instance of SymfonyComponentHttpFoundationRateLimiterRequestRateLimiterInterface, instance of SymfonyComponentRateLimiterRateLimiterFactory given,

我的理解是,我给它一个工厂而不是我想要的实例,但是在文档中没有任何地方我可以找到如何从工厂获得实例

如果你想使用自定义限制器,你需要创建一个自己的限制器。然后在services.yml中定义为服务一个适合我的例子

<?php
declare(strict_types=1);
namespace AppLimiter;
use SymfonyComponentHttpFoundationRateLimiterRequestRateLimiterInterface;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentRateLimiterLimiterInterface;
use SymfonyComponentRateLimiterRateLimit;
use SymfonyComponentRateLimiterRateLimiterFactory;
class CustomLimiter implements RequestRateLimiterInterface
{
/**
* @var LimiterInterface
*/
private $limiter;

public function __construct(RateLimiterFactory $factory)
{
$this->limiter = $factory->create('a_unique_identifier');
}

public function consume(Request $request): RateLimit
{

return $this->limiter->consume();
}

public function reset(Request $request): void
{
$this->limiter->reset();
}

}

服务。Yml定义了一个自定义限制器。您应该将max_limitter配置作为参数传递

app.custom.limiter:
class: AppLimiterCustomLimiter
arguments:
- '@limiter.max_login_failure'
最后,您应该将新的限制器粘贴到安全配置
security:
firewalls:
admins:
host: admin.*
pattern: ^/
provider: admins
login_throttling:
limiter: app.custom.limiter

就是这样!我希望这对你有帮助。

相关内容

  • 没有找到相关文章

最新更新