Files
termanager2/app/Http/Controllers/Auth/PasswordChangeController.php

67 lines
2.5 KiB
PHP

<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Validation\Rules\Password;
/**
* Cambio password obbligatorio, imposto dopo il ripristino di un backup.
*
* Volutamente NON e' un componente Livewire: la pagina deve restare
* raggiungibile mentre RequirePasswordChange respinge tutto il resto, incluse
* le richieste /livewire/update. Due rotte HTTP normali sono banali da
* escludere; distinguere quale componente sta dietro una POST di Livewire no.
*/
class PasswordChangeController extends Controller
{
public function show()
{
return view('auth.password-change', [
'user' => auth()->user(),
// Chi arriva qui spontaneamente (dal profilo) puo' tornare indietro;
// chi e' stato dirottato dal middleware no.
'forced' => (bool) auth()->user()->password_change_required,
]);
}
public function store(Request $request)
{
// La password attuale NON viene richiesta, ed e' una scelta.
//
// Il ripristino sovrascrive gli hash con quelli del backup: subito dopo,
// la "password attuale" di un account e' quella che aveva all'epoca del
// backup, che l'utente puo' benissimo non ricordare — l'amministratore
// che ha appena fatto il restore per primo. Chiederla bloccherebbe fuori
// proprio le persone che questa schermata deve sbloccare. La garanzia
// qui e' la sessione: si arriva a questa pagina gia' autenticati.
$validated = $request->validate([
'password' => ['required', 'confirmed', Password::min(8)],
], [
'password.required' => 'Inserisci la nuova password.',
'password.confirmed' => 'Le due password non coincidono.',
]);
$user = $request->user();
// Il cast `hashed` sul modello cifra il valore al salvataggio.
$user->update([
'password' => $validated['password'],
'password_change_required' => false,
]);
// La sessione corrente sopravvive al cambio, le altre no: dopo un
// ripristino le vecchie credenziali sono da considerarsi compromesse e
// una sessione aperta altrove lo e' altrettanto.
$request->session()->regenerate();
$user->setRememberToken(null);
$user->save();
activity()->causedBy($user)->log('password changed');
return redirect()->route('dashboard')
->with('success', 'Password aggiornata. Da ora accedi con quella nuova.');
}
}