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

问题描述 投票:0回答:1

为了满足安全审核,我需要实现一个功能,用户每 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 的实例,

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

php symfony symfony-ratelimiter
1个回答
4
投票

如果您想使用自定义限制器,您需要创建一个自己的限制器。 然后在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

仅此而已!我希望这对你有帮助

© www.soinside.com 2019 - 2024. All rights reserved.