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