Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony5:登录限制失败必须是RequestRateLimiterInterface的实例,RateLimiterFactory的实例已给定_Php_Symfony - Fatal编程技术网

Php Symfony5:登录限制失败必须是RequestRateLimiterInterface的实例,RateLimiterFactory的实例已给定

Php Symfony5:登录限制失败必须是RequestRateLimiterInterface的实例,RateLimiterFactory的实例已给定,php,symfony,Php,Symfony,为了满足安全审计的要求,我需要实现一个特性,用户每5分钟最多可以尝试登录3次 幸运的是,它现在是内置的Symfony 5.2: 由于参数max\u attempts对我来说不够(每1分钟一次),我想使用第二个选项来提供我的所有者限制 所以我用这个 我的配置如下所示 框架: 速率限制器: 最大登录失败次数: 策略:固定窗口 限额:3 间隔时间:“10分钟” 安全: 防火墙: 管理员: 主持人:管理员* 模式:^/ 提供者:管理员 登录\u限制: 限制器:限制器.max\u登录\u失败 但它失败了

为了满足安全审计的要求,我需要实现一个特性,用户每5分钟最多可以尝试登录3次

幸运的是,它现在是内置的Symfony 5.2:

由于参数
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它工作起来很有魅力!谢谢:)