first commit

This commit is contained in:
brusnitsyn
2026-06-24 17:20:43 +09:00
commit 43499acf1c
165 changed files with 25929 additions and 0 deletions

24
routes/console.php Normal file
View File

@@ -0,0 +1,24 @@
<?php
use Illuminate\Foundation\Inspiring;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Schedule;
Artisan::command('inspire', function () {
$this->comment(Inspiring::quote());
})->purpose('Display an inspiring quote');
/*
|--------------------------------------------------------------------------
| Регламентные задачи безопасности
|--------------------------------------------------------------------------
*/
// Контроль целостности журнала аудита (РСБ.3) — ежедневно.
Schedule::command('audit:verify')->dailyAt('01:00')->onOneServer();
// Очистка журнала по сроку хранения (РСБ.4, РСБ.8) — еженедельно.
Schedule::command('audit:purge')->weekly()->sundays()->at('02:00')->onOneServer();
// Проверка уязвимостей зависимостей (УКФ.4) — ежедневно.
Schedule::command('security:audit-deps')->dailyAt('03:00')->onOneServer();

65
routes/web.php Normal file
View File

@@ -0,0 +1,65 @@
<?php
use App\Http\Controllers\Auth\AuthenticatedSessionController;
use App\Http\Controllers\Auth\PasswordController;
use App\Http\Controllers\Auth\TwoFactorController;
use Illuminate\Support\Facades\Route;
use Inertia\Inertia;
/*
|--------------------------------------------------------------------------
| Публичные маршруты
|--------------------------------------------------------------------------
*/
Route::inertia('/', 'Welcome')->name('home');
/*
|--------------------------------------------------------------------------
| Аутентификация (меры ИАФ.*, РСБ.2)
|--------------------------------------------------------------------------
| Вход защищён ограничением частоты (throttle) мера ИАФ.6/УПД.6.
*/
Route::middleware('guest')->group(function () {
Route::get('login', [AuthenticatedSessionController::class, 'create'])->name('login');
// Блокировка после N неудачных попыток реализована в LoginRequest (ИАФ.6)
// с регистрацией события auth.locked в журнале (РСБ.2).
Route::post('login', [AuthenticatedSessionController::class, 'store']);
});
Route::post('logout', [AuthenticatedSessionController::class, 'destroy'])
->middleware('auth')
->name('logout');
/*
|--------------------------------------------------------------------------
| Многофакторная аутентификация (мера ИАФ.4)
|--------------------------------------------------------------------------
| Доступны аутентифицированному пользователю до прохождения второго фактора.
*/
Route::middleware('auth')->group(function () {
Route::get('mfa/setup', [TwoFactorController::class, 'setup'])->name('mfa.setup');
Route::post('mfa/enable', [TwoFactorController::class, 'enable'])->name('mfa.enable');
Route::get('mfa/challenge', [TwoFactorController::class, 'challenge'])->name('mfa.challenge');
Route::post('mfa/verify', [TwoFactorController::class, 'verify'])
->middleware('throttle:login')
->name('mfa.verify');
Route::delete('mfa', [TwoFactorController::class, 'disable'])->name('mfa.disable');
// Принудительная смена пароля по истечении срока (мера ИАФ.3).
Route::get('password/expired', [PasswordController::class, 'expired'])->name('password.expired');
Route::put('password', [PasswordController::class, 'update'])->name('password.update');
});
/*
|--------------------------------------------------------------------------
| Защищённая зона: требует аутентификации, второго фактора и актуального пароля
|--------------------------------------------------------------------------
| Полный стек мер: auth -> mfa (ИАФ.4) -> password.fresh (ИАФ.3) -> audit (РСБ.2).
*/
Route::middleware(['auth', 'mfa', 'password.fresh', 'audit'])->group(function () {
Route::get('dashboard', fn () => Inertia::render('Dashboard'))->name('dashboard');
// Здесь размещайте маршруты работы с ПДн. Доступ дополнительно проверяется
// через Policy (мера УПД.2), например:
// Route::resource('personal-data', PersonalDataController::class);
});