Skip to content
rate limiter for symfony 4
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
src
.gitignore
README.md
composer.json

README.md

Rate-Limit-Bundle

主要提供了路由限流功能,限流的参数可由自定义函数动态进行控制

运行环境

  • php 7.1+
  • symfony 4
  • composer
  • redis

功能

  • 静态限流
  • 动态限流
  • 根据 ip + 路由 进行限制

安装

composer require yansongda/rate-limit-bundle -vvv

概要

根据 IP + 路由名 进行确定特定的客户端,通过 redis 进行限流记录。

使用

静态限流

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
use Yansongda\RateLimitBundle\Annotation\Throttle;

class HomeController extends AbstractController
{
    /**
     * 静态限流: 同一个 IP 访问 test 路由,60 秒内只能访问 2 次.
     *
     * @author yansongda <me@yansongda.cn>
     *
     * @Route("/test", name="test")
     * @Throttle(limit=2, period=60)
     * 
     * @return mixed
     */
    public function testAction()
    {
        return JsonResponse::create(['code' => 0]);
    }
}

动态限流

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
use Yansongda\RateLimitBundle\Annotation\Throttle;

class HomeController extends AbstractController
{
    /**
     * 动态限流:具体的 limit 及 period 参数由 custom 返回.
     *
     * @author yansongda <me@yansongda.cn>
     *
     * @Route("/test", name="token")
     * @Throttle(limit=2, period=60, custom={"App\Throttles\CustomLimitPeriod", "token"})
     * 
     * @return mixed
     */
    public function tokenAction()
    {
        return JsonResponse::create(['code' => 0]);
    }
}
<?php

namespace App\Throttles;

use Symfony\Component\HttpFoundation\Request;

class CustomLimitPeriod
{
    /**
     * 自定义限流策略.
     *
     * @author yansongda <me@yansongda.cn>
     * @param Request $request 此参数回调时自动载入
     *
     * @return array
     */
    public function token(Request $request)
    {
        // 返回的数据中,第一个为 limit,第二个为 period,必须为 int 类型。如果 limit 返回 -1 则无限制
        return [20, 60];
    }
}

配置

下面是默认的配置信息。如果需要更改,在 config 的 packages 目录下新建一个 yml 文件,然后复制以下内容更改即可。

yansongda_rate_limit:
    # 是否开启
    enable: true
    
    # snc_redis 客户端
    redis_client: default
    
    # 是否展示 headers
    display_headers: true
    
    # headers 的 key
    headers:
        limit: X-RateLimit-Limit
        remaining: X-RateLimit-Remaining
        reset: X-RateLimit-Reset
        
    # response 内容,如果 exception 不为 null,则默认抛出写入的 exception
    response:
        message: 'Out Of Limit'
        code: 429
        exception: null
You can’t perform that action at this time.