Files
termanager2/app/Models/User.php
Francesco Picone ac787039c3 ++ amministratori esenti dalla conferma email
Chi ha il ruolo amministratore non deve confermare l'indirizzo
(User::esenteDaConfermaEmail): non riceve l'email di conferma né alla
creazione né al cambio d'indirizzo, in Utenti compare "esente". Se perde
il ruolo torna a valere email_verified_at.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 12:19:29 +02:00

102 lines
2.8 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Spatie\Permission\Traits\HasRoles;
use Spatie\Activitylog\Traits\LogsActivity;
use Spatie\Activitylog\LogOptions;
/**
* MustVerifyEmail: l'account funziona solo con l'indirizzo confermato
* (middleware `verified`, VerificaEmailController). Chi cambia email — dal
* profilo o perché la cambia l'amministratore — torna da confermare.
*/
class User extends Authenticatable implements MustVerifyEmail
{
use HasFactory, Notifiable, HasRoles, LogsActivity;
protected $fillable = [
'name',
'email',
'password',
'password_change_required',
];
protected $hidden = [
'password',
'remember_token',
];
protected function casts(): array
{
return [
'email_verified_at' => 'datetime',
'password' => 'hashed',
'password_change_required' => 'boolean',
];
}
public function getActivitylogOptions(): LogOptions
{
return LogOptions::defaults()
->logOnly(['name', 'email'])
->logOnlyDirty()
->dontSubmitEmptyLogs();
}
protected static function booted(): void
{
// Un indirizzo nuovo va confermato di nuovo, chiunque lo cambi.
static::updating(function (self $utente) {
if ($utente->isDirty('email') && ! $utente->isDirty('email_verified_at')) {
$utente->email_verified_at = null;
}
});
}
/**
* Gli amministratori sono esenti dalla conferma dell'email: scelta
* esplicita, perché l'amministratore deve poter entrare anche quando la
* posta non funziona (è lui che la configura). Vale finché ha il ruolo:
* se lo perde, torna a contare `email_verified_at`.
*/
public function esenteDaConfermaEmail(): bool
{
return $this->hasRole('amministratore');
}
/**
* Usato dal middleware `verified`: un esente è sempre "confermato".
*/
public function hasVerifiedEmail(): bool
{
return $this->esenteDaConfermaEmail() || ! is_null($this->email_verified_at);
}
/**
* Manda l'email di conferma; false se il server di posta non risponde o
* rifiuta. Chi chiama decide cosa dire: l'utente è comunque salvato, e
* l'email si può richiedere di nuovo. Agli esenti non si manda nulla.
*/
public function inviaConfermaEmail(): bool
{
if ($this->esenteDaConfermaEmail()) {
return true;
}
try {
$this->sendEmailVerificationNotification();
} catch (\Throwable $e) {
report($e);
return false;
}
return true;
}
}