- Sciolto, il gruppo non resta nello storico: si elimina (via sciolto_at;
la migrazione elimina anche quelli gia' sciolti). I territori solo nel
pacchetto tornano in reparto; quelli gia' dati restano ai membri, e
l'assegnazione conserva il nome del gruppo (assegnazioni.gruppo_nome).
- Creando il gruppo non si chiede l'email: users.username dal nome del
gruppo ("Gruppo Zisa" -> gruppo.zisa), users.email facoltativa. Login con
"Email o nome utente". Nome del gruppo unico.
- Sciolto il gruppo il nome utente si libera (l'utenza disattivata prende
ex.sorvegliante.<id>). XML: nome utente e gruppo_nome.
- Profilo, testata, cambio password e Utenti mostrano il nome utente dove
manca l'email. Informativa privacy, README, HANDOFF e test aggiornati.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
70 lines
2.6 KiB
PHP
70 lines
2.6 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Auth;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Facades\RateLimiter;
|
|
use Illuminate\Support\Str;
|
|
|
|
class LoginController extends Controller
|
|
{
|
|
public function __invoke(Request $request): RedirectResponse
|
|
{
|
|
// Il campo si chiama "email" ma accetta anche il nome utente del
|
|
// sorvegliante di gruppo, che l'email non ce l'ha: con la chiocciola è
|
|
// un'email, senza un nome utente (che la chiocciola non la contiene mai).
|
|
$credentials = $request->validate([
|
|
'email' => ['required', 'string', 'max:255'],
|
|
'password' => ['required', 'string', 'min:6'],
|
|
'remember' => ['nullable', 'boolean'],
|
|
]);
|
|
|
|
$throttleKey = Str::transliterate(Str::lower($credentials['email']) . '|' . $request->ip());
|
|
|
|
if (RateLimiter::tooManyAttempts($throttleKey, 5)) {
|
|
$seconds = RateLimiter::availableIn($throttleKey);
|
|
|
|
return back()
|
|
->withErrors(['email' => "Troppi tentativi. Riprova tra {$seconds} secondi."])
|
|
->withInput($request->only('email', 'remember'));
|
|
}
|
|
|
|
$identificativo = trim($credentials['email']);
|
|
$campo = str_contains($identificativo, '@') ? 'email' : 'username';
|
|
|
|
if (! Auth::attempt([
|
|
$campo => $campo === 'username' ? Str::lower($identificativo) : $identificativo,
|
|
'password' => $credentials['password'],
|
|
], $request->boolean('remember'))) {
|
|
RateLimiter::hit($throttleKey);
|
|
|
|
return back()
|
|
->withErrors(['email' => 'Credenziali non valide.'])
|
|
->withInput($request->only('email', 'remember'));
|
|
}
|
|
|
|
// Utenza disattivata (gruppo di servizio sciolto): la password è giusta
|
|
// ma non si entra.
|
|
if (Auth::user()->isDisattivato()) {
|
|
Auth::logout();
|
|
|
|
return back()
|
|
->withErrors(['email' => 'Questa utenza è stata disattivata.'])
|
|
->withInput($request->only('email', 'remember'));
|
|
}
|
|
|
|
RateLimiter::clear($throttleKey);
|
|
$request->session()->regenerate();
|
|
activity()->causedBy(auth()->user())->log('login');
|
|
|
|
// Il sorvegliante di gruppo va dritto al suo gruppo.
|
|
if (Auth::user()->isSorvegliante() && Auth::user()->roles->count() === 1) {
|
|
return redirect()->route('mio-gruppo');
|
|
}
|
|
|
|
return redirect()->intended(route('dashboard'));
|
|
}
|
|
} |