1 заметка с тегом

rateLimiter

Ограничить количество запросов к приложению в Yii2

Добавьте в behavior след.правило:

public function behaviors()
{
    return [
        'rateLimiter' => [
            'class' => yii\filters\RateLimiter::className(),
            'enableRateLimitHeaders' => false, // не передавать в хедере оставш. кол-во запросов и время
            'errorMessage' => 'Слишком много запросов',
            'only' => ['index'], // Определить экшн для применения
            'user' => new UrlRateLimiter(),
        ],
    ];
}

UrlRateLimiter — описан в отдельном классе, для удобства и представляет следующий код:

namespace api\models;

use common\models\User;
use yii\filters\RateLimitInterface;

/**
 * Class UrlRateLimiter
 * Ключ для кеша строится по URL-запроса
 *
 * @package api\models
 */
class UrlRateLimiter extends User implements RateLimitInterface
{
    public $rateLimit = 6;
    public $allowance;
    public $allowance_updated_at;
    
    /**
     * Кол-во разрешенных запросов в секунду
     *
     * @param \yii\web\Request $request
     * @param \yii\base\Action $action
     * @return array
     */
    public function getRateLimit($request, $action)
    {
        // rateLimit - кол-во
        // 10 - это секунды
        return [$this->rateLimit, 10];
    }
    
    public function loadAllowance($request, $action)
    {
        $cache = \Yii::$app->cache;
        $key = sha1(serialize($request->url));
        return [
            $cache->get('user.ratelimit.ip.allowance.' . $key),
            $cache->get('user.ratelimit.ip.allowance_updated_at.' . $key),
        ];
    }
    
    /**
     * Метод сохранит в кеш
     * @param \yii\web\Request $request
     * @param \yii\base\Action $action
     * @param int $allowance
     * @param int $timestamp
     */
    public function saveAllowance($request, $action, $allowance, $timestamp)
    {
        $cache = \Yii::$app->cache;
        $key = sha1(serialize($request->url));
        
        $cache->set('user.ratelimit.ip.allowance.' . $key, $allowance);
        $cache->set('user.ratelimit.ip.allowance_updated_at.' . $key, $timestamp);
        
    }
}

Опубликован код здесь

2017   rateLimiter   yii2