为了满足安全审核,我需要实现一个功能,用户每 5 分钟最多可以尝试登录 3 次
幸运的是,它现在内置于 Symfony 5.2:https://symfony.com/blog/new-in-symfony-5-2-login-throtdling
由于参数
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
但是失败并出现错误
传递给 Symfony\Component\Security\Http\EventListener\LoginThrotdlingListener::__construct() 的参数 2 必须是 Symfony\Component\HttpFoundation\RateLimiter\RequestRateLimiterInterface 的实例,给定的 Symfony\Component\RateLimiter\RateLimiterFactory 的实例,
我的理解是,我给它一个工厂而不是我想要的实例,但文档中没有任何地方可以找到如何从工厂获取实例
如果您想使用自定义限制器,您需要创建一个自己的限制器。 然后在services.yml中定义为服务 一个对我有用的例子
<?php
declare(strict_types=1);
namespace App\Limiter;
use Symfony\Component\HttpFoundation\RateLimiter\RequestRateLimiterInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\RateLimiter\LimiterInterface;
use Symfony\Component\RateLimiter\RateLimit;
use Symfony\Component\RateLimiter\RateLimiterFactory;
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();
}
}
在 services.yml 中定义自定义限制器。您应该将 max_limiter 配置作为参数传递
app.custom.limiter:
class: App\Limiter\CustomLimiter
arguments:
- '@limiter.max_login_failure'
最后,您应该将新的限制器粘贴到安全配置中
security:
firewalls:
admins:
host: admin.*
pattern: ^/
provider: admins
login_throttling:
limiter: app.custom.limiter
仅此而已!我希望这对你有帮助