Php Symfony5:登录限制失败必须是RequestRateLimiterInterface的实例,RateLimiterFactory的实例已给定
为了满足安全审计的要求,我需要实现一个特性,用户每5分钟最多可以尝试登录3次 幸运的是,它现在是内置的Symfony 5.2: 由于参数Php Symfony5:登录限制失败必须是RequestRateLimiterInterface的实例,RateLimiterFactory的实例已给定,php,symfony,Php,Symfony,为了满足安全审计的要求,我需要实现一个特性,用户每5分钟最多可以尝试登录3次 幸运的是,它现在是内置的Symfony 5.2: 由于参数max\u attempts对我来说不够(每1分钟一次),我想使用第二个选项来提供我的所有者限制 所以我用这个 我的配置如下所示 框架: 速率限制器: 最大登录失败次数: 策略:固定窗口 限额:3 间隔时间:“10分钟” 安全: 防火墙: 管理员: 主持人:管理员* 模式:^/ 提供者:管理员 登录\u限制: 限制器:限制器.max\u登录\u失败 但它失败了
max\u attempts
对我来说不够(每1分钟一次),我想使用第二个选项来提供我的所有者限制
所以我用这个
我的配置如下所示
框架:
速率限制器:
最大登录失败次数:
策略:固定窗口
限额:3
间隔时间:“10分钟”
安全:
防火墙:
管理员:
主持人:管理员*
模式:^/
提供者:管理员
登录\u限制:
限制器:限制器.max\u登录\u失败
但它失败了,出现了错误
Argument 2 passed to Symfony\Component\Security\Http\EventListener\LoginThrottlingListener::__construct() must be an instance of Symfony\Component\HttpFoundation\RateLimiter\RequestRateLimiterInterface, instance of Symfony\Component\RateLimiter\RateLimiterFactory given,
我的理解是,我给它一个工厂,而不是我想要的一个实例,但是在文档中我找不到如何从工厂获取实例的地方如果你想使用自定义限制器,你需要创建一个自己的限制器。 然后在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();
}
}
最后,您应该将新的限制器粘贴到安全配置中
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
就这些!我希望这对你有所帮助你能在使用限制器的地方分享控制器代码吗?@El_Vanja我没有在任何控制器中使用限制器,我正在用防火墙插入它谢谢@shevon,很高兴成为你帮助的第一人,所以:),我将尝试并告诉您它是否适合我。它看起来是一个很好的解决方案,但服务声明不好,它是Symfony 2语法。使用类作为Id,并将autowire和autoconfigure设置为true。如果您在控制器中设置参数(并使用接口类),请不要忘记添加typehint。@shevon它工作起来很有魅力!谢谢:)