LoginSignup
3
1

More than 1 year has passed since last update.

symfony/rate-limiterを使ってみた

Last updated at Posted at 2022-12-01

EC-CUBE4.2.1の開発で、symfony/rate-limiterを使ってみたのでメモ。

symfony/rate-limiterとは?

試行回数制限の機能を実装できるライブラリです。
30分間に5回までアクセス許可する、というような試行回数制限の機能を簡単に実装できます。

公式ドキュメントは↓
https://symfony.com/doc/current/rate_limiter.html

使い方

symfony/rate-limiterのインストール

$ composer require symfony/rate-limiter

rate_limiter.yamlに設定を記載します。
以下は30分間に5回までの制限をかけるサンプルです。

framework:
  rate_limiter:
    hoge:
      policy: fixed_window
      limit: 5
      interval: '30 minutes' 

コントローラなどの利用したい箇所でインジェクションし、処理を実装します。
以下はIPアドレスをキーとして試行回数制限をかけるサンプルです。

class HogeController
{
    /**
     * @Route("/hoge")
     */
    // $<yamlで定義したキー名>Limiterでインジェクションする
    public function index(RateLimiterFactory $hogeLimiter, Request $request) 
    {
        // ipアドレスをキーとしてlimiterを生成
        $limiter = $hoge->create($request->getClientIp());

        // 試行回数をカウントし、超過したらアクセスを拒否する
        if ($limiter->consume()->isAccepted()) {
            throw new TooManyRequestsHttpException()
        } 
    }
}

以上で完了です!

EC-CUBE 4.2.1ではスロットリングの機能が追加されますが、このsymfony/rate-limiterを利用して実装しています。機能に対するご要望や、実装へのご意見あればぜひコメントお願いします!

メモ

デフォルトでは試行回数のログはファイルシステムに保存されますが、DBやredis等に保存することも可能です。以下はDBに保存する設定のサンプルです。webサーバを冗長化する際に利用するとよいかと思います。

framework:
  cache:
    pools:
      rate_limiter.cache:
        adapter: cache.adapter.pdo
  rate_limiter:
    hoge:
      policy: fixed_window
      limit: 5
      interval: '30 minutes' 
      cache_pool: rate_limiter.cache
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1