configureDefaults(); $this->configureRateLimiting(); } /** * Configure default behaviors for production-ready applications. */ protected function configureDefaults(): void { Date::use(CarbonImmutable::class); DB::prohibitDestructiveCommands( app()->isProduction(), ); // Единая парольная политика приложения (мера ИАФ.3). Password::defaults(fn (): Password => PasswordPolicy::rule()); } /** * Ограничение частоты обращений (меры ИАФ.6, УПД.6, защита от перебора). */ protected function configureRateLimiting(): void { RateLimiter::for('login', function (Request $request) { $max = (int) config('security.lockout.max_attempts'); $decay = (int) config('security.lockout.decay_minutes'); return Limit::perMinutes($decay, $max) ->by(mb_strtolower((string) $request->input('email')).'|'.$request->ip()); }); RateLimiter::for('api', fn (Request $request) => Limit::perMinute(60)->by( optional($request->user())->id ?: $request->ip() )); } }