为了满足安全审计,我需要实现一个功能,其中用户每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
就是这样!我希望这对你有帮助。