MIF_E31230069/spk_kontrakan/app/Providers/AppServiceProvider.php

102 lines
3.7 KiB
PHP

<?php
namespace App\Providers;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\ServiceProvider;
use Illuminate\Auth\Notifications\VerifyEmail;
use Illuminate\Notifications\Messages\MailMessage;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*/
public function register(): void
{
//
}
/**
* Bootstrap any application services.
*/
public function boot(): void
{
// ============================
// Rate Limiting Configuration
// ============================
// Default API rate limit: 60 requests per minute
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by(
$request->user()?->id ?: $request->ip()
)->response(function () {
return response()->json([
'success' => false,
'message' => 'Terlalu banyak request. Maksimal 60 request per menit.',
'error_code' => 'RATE_LIMIT_EXCEEDED',
], 429);
});
});
// Login rate limit: 5 attempts per minute (brute force protection)
RateLimiter::for('login', function (Request $request) {
return Limit::perMinute(5)->by(
$request->input('email', '') . '|' . $request->ip()
)->response(function () {
return response()->json([
'success' => false,
'message' => 'Terlalu banyak percobaan login. Coba lagi dalam 1 menit.',
'error_code' => 'LOGIN_THROTTLED',
], 429);
});
});
// Register rate limit: 3 per hour per IP
RateLimiter::for('register', function (Request $request) {
return Limit::perHour(3)->by(
$request->ip()
)->response(function () {
return response()->json([
'success' => false,
'message' => 'Terlalu banyak registrasi dari IP ini. Coba lagi nanti.',
'error_code' => 'REGISTER_THROTTLED',
], 429);
});
});
// SAW calculation rate limit: 30 per minute
RateLimiter::for('saw', function (Request $request) {
return Limit::perMinute(30)->by(
$request->user()?->id ?: $request->ip()
)->response(function () {
return response()->json([
'success' => false,
'message' => 'Terlalu banyak perhitungan SAW. Coba lagi nanti.',
'error_code' => 'SAW_THROTTLED',
], 429);
});
});
// Export rate limit: 10 per minute
RateLimiter::for('export', function (Request $request) {
return Limit::perMinute(10)->by(
$request->user()?->id ?: $request->ip()
);
});
// Kustomisasi Email Verifikasi Berbahasa Indonesia
VerifyEmail::toMailUsing(function (object $notifiable, string $url) {
return (new MailMessage)
->subject('Verifikasi Alamat Email - Kontrak Kampus')
->greeting('Halo, ' . $notifiable->name . '!')
->line('Silakan klik tombol di bawah ini untuk memverifikasi alamat email akun Kontrak Kampus Anda.')
->action('Verifikasi Email', $url)
->line('Jika Anda tidak merasa mendaftar akun di aplikasi kami, Anda dapat mengabaikan email ini.')
->salutation('Salam Hangat, \nTim Kontrak Kampus');
});
}
}