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
72 lines
2.7 KiB
PHP
72 lines
2.7 KiB
PHP
<?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());
|
||
});
|
||
}
|
||
} |