auth tests

This commit is contained in:
Giuseppe Naponiello
2026-06-22 14:31:44 +02:00
parent 34a8ebc6fb
commit cc4e174880
75 changed files with 4679 additions and 168 deletions

36
backend/routes/api.php Normal file
View File

@@ -0,0 +1,36 @@
<?php
use App\Http\Controllers\AuthController;
use Illuminate\Support\Facades\Route;
// File "core": rotte di sessione e pubbliche trasversali. Le rotte per modello
// stanno in routes/api/*.php, caricate automaticamente dal then: in bootstrap/app.php
// (prefisso `api` + tier riusabili `tier.app` / `tier.admin`).
$AUTH = 'auth:sanctum';
// -----------------------------------------------------------------------
// Rotte pubbliche (nessun auth), protette dal throttling.
// Limiter `public` definito in App\Providers\AppServiceProvider::boot()
// (60 req/min per IP) — modificare lì il limite.
// -----------------------------------------------------------------------
Route::middleware('throttle:public')->group(function () {
// Solo endpoint GET (index/show) leggibili da chiunque.
});
// -----------------------------------------------------------------------
// Tier "transitional": autenticato, MA setup eventualmente incompleto
// (password forzata da cambiare e/o 2FA non ancora configurata).
//
// ⚠️ NON aggiungere `setup.complete` qui: queste rotte devono restare
// raggiungibili PROPRIO durante il setup, altrimenti deadlock. In particolare
// il frontend legge GET /user per scoprire `setup_status` e decidere cosa
// mostrare. Le azioni di setup vero (cambio password, abilitazione 2FA) e la
// verifica email le registra Fortify, già auth-only e fuori da `setup.complete`.
// -----------------------------------------------------------------------
Route::middleware($AUTH)->group(function () {
Route::get('/user', [AuthController::class, 'me']);
// Sovrascrive la rotta logout di Fortify (registrata dopo → precedenza).
Route::post('/logout', [AuthController::class, 'logout']);
Route::delete('/account', [AuthController::class, 'destroyAccount']);
});

View File

@@ -0,0 +1,18 @@
<?php
use App\Http\Controllers\UserRoleController;
use Illuminate\Support\Facades\Route;
// Prefisso `api` e stack `api` sono applicati dal loader in bootstrap/app.php.
// I tier `tier.app` / `tier.admin` sono definiti lì come middleware group.
// Lettura: utente pienamente operativo (verificato + setup completato).
Route::middleware('tier.app')->group(function () {
Route::apiResource('user-roles', UserRoleController::class)->only(['index', 'show']);
Route::get('user-roles/{user_role}/usage', [UserRoleController::class, 'usage']);
});
// Scrittura: solo Admin.
Route::middleware('tier.admin')->group(function () {
Route::apiResource('user-roles', UserRoleController::class)->only(['store', 'update', 'destroy']);
});

View File

@@ -0,0 +1,11 @@
<?php
use App\Http\Controllers\UserController;
use Illuminate\Support\Facades\Route;
// Gestione utenti (sola lettura): area admin.
Route::middleware('tier.admin')->group(function () {
Route::get('users', [UserController::class, 'index']);
// withTrashed: l'admin può ispezionare anche utenti cestinati/anonimizzati.
Route::get('users/{user}', [UserController::class, 'show'])->withTrashed();
});

View File

@@ -2,7 +2,11 @@
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');
// Anonimizzazione GDPR degli utenti oltre la retention (richiede lo scheduler attivo).
Schedule::command('users:purge')->daily();