ifnex/04_Laravel/app/Providers/AppServiceProvider.php
Kazem Alghasi a5fd01dde1 chore(api): implement rate limiting for sensitive endpoints
Introduce granular rate limiting across various API categories to
improve security and prevent abuse. This includes protection against
brute-force attacks on authentication and SMS endpoints, as well as
resource management for public, customer, wallet, and staff APIs.

- Add `auth` rate limiter (5 requests/min per IP)
- Add `sms` rate limiter (1 request/min per phone/IP)
- Add `public` rate limiter (30 requests/min per IP)
- Add `customer` rate limiter (60 requests/min per user)
- Add `wallet` rate limiter (30 requests/min per user)
- Add `staff` rate limiter (60 requests/min per user)
- Apply middleware to corresponding routes in `api.php`
- Remove obsolete `test_pdf_generation.php` script
2026-10-04 01:35:22 +03:30

72 lines
2.7 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
use App\Models\Shipment;
use App\Observers\ShipmentObserver;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*/
public function register(): void
{
//
}
/**
* Bootstrap any application services.
*/
public function boot(): void
{
// هک برای رفع مشکل دیسک اکسل در لاراول ۱۱/۱۲
config(['excel.temporary_files.disk' => 'local']);
// ثبت Observer برای اطلاعیه‌های تغییر سفارش
Shipment::observe(ShipmentObserver::class);
// Explicitly require the IFNEX number helper file so
// ifnex_format_number() / ifnex_persian_digits() / ifnex_trend_percent()
// are available even before `composer dump-autoload` is re-run.
$helperPath = base_path('app/Helpers/number.php');
if (is_file($helperPath)) {
require_once $helperPath;
}
// ─── Rate Limiting برای APIهای حساس ───
RateLimiter::for('auth', function (Request $request) {
// لاگین: ۵ درخواست در دقیقه per IP (جلوگیری از brute-force)
return Limit::perMinute(5)->by($request->ip());
});
RateLimiter::for('sms', function (Request $request) {
// ارسال کد پیامکی: ۱ درخواست در دقیقه per شماره موبایل
return Limit::perMinute(1)->by($request->input('phone') ?: $request->ip());
});
RateLimiter::for('public', function (Request $request) {
// API عمومی (رهگیری، استعلام قیمت): ۳۰ درخواست در دقیقه per IP
return Limit::perMinute(30)->by($request->ip());
});
RateLimiter::for('customer', function (Request $request) {
// API مشتری (لاگین‌شده): ۶۰ درخواست در دقیقه per user
return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});
RateLimiter::for('wallet', function (Request $request) {
// عملیات مالی حساس (پرداخت، شارژ، freeze): ۳۰ درخواست در دقیقه per user
return Limit::perMinute(30)->by($request->user()?->id ?: $request->ip());
});
RateLimiter::for('staff', function (Request $request) {
// API کارمند: ۶۰ درخواست در دقیقه per user
return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});
}
}