Ruoli & Menu

Mappatura completa ruoli → voci menu, utenti reali, policy di sicurezza

I 3 ruoli

Amministrazione

Supervisione dell'applicazione. NON inserisce analisi né lotti.

Può:

  • Gestire utenti (crea, modifica, reset password)
  • Vedere analisi cancellate (e ripristinarle o cancellare definitivamente)
  • Vedere tutte le analisi in corso/concluse (READ)
Laboratorio

Workflow operativo completo. Il ruolo più potente in termini di funzionalità.

Può:

  • Tutto ciò che serve per le analisi (nuova, cerca, chiudi, stampa)
  • Vedere badge "Da analizzare" con alert
  • Creare lotti, produttori, varietà, specie
  • Impostare lotti come esauriti
Magazzino

Accettazione merce + consultazione. NO gestione analisi.

Può:

  • Creare lotti (accettazione seme in arrivo)
  • Impostare lotti esauriti
  • Anagrafiche: produttori, varietà, specie
  • Cercare/vedere analisi (non crea né chiude)

Mappa completa ruolo → voce menu (dal DB live)

Dati estratti da permesso_menu JOIN menu JOIN permesso:

Voce menuURLAmministrazioneLaboratorioMagazzino
Amministrazione (root)/amministrazione
└ Utenti/amministrazione/utenti
└ Analisi Cancellate/amministrazione/analisis/cancellate
Analisi (root)/analisis/inCorso
└ In Corso/analisis/inCorso
└ Cerca/analisis/
└ Nuova/analisis/analisi/new
Produttore (root)/produttores/
└ Lista/produttores/
└ Aggiungi/produttores/produttore/new
Da Analizzare (badge)/analisis/daAnalizzare
Lotto (root)/lottos/
└ Setta come esaurito/lottos/
└ Aggiungi/lottos/lotto/new
Varietà (root)/varietas/
└ Lista/varietas/
└ Aggiungi/varietas/varieta/new
Specie (root)/species/
└ Lista/species/
└ Aggiungi/species/specie/new

Visualizzazione menu per ruolo

Menu Amministrazione
┌──────────────────────────────────────┐
│ Germinabilità                        │
│ ─ Amministrazione ▾                  │
│    └ Utenti                          │
│    └ Analisi Cancellate              │
│ ─ Analisi                            │
│ ─                                    │
│                       diego ▾  [Esci]│
└──────────────────────────────────────┘
Menu Laboratorio
┌──────────────────────────────────────┐
│ Germinabilità                        │
│ ─ Analisi ▾                          │
│    └ In Corso  [179]                 │
│    └ Cerca                           │
│    └ Nuova                           │
│ ─ Produttore ▾                       │
│    └ Lista                           │
│    └ Aggiungi                        │
│ ─ Da Analizzare  [3]                 │
│ ─ Lotto ▾                            │
│    └ Setta come esaurito             │
│    └ Aggiungi                        │
│ ─ Varietà ▾  (Lista / Aggiungi)      │
│ ─ Specie ▾   (Lista / Aggiungi)      │
│                        ana ▾  [Esci] │
└──────────────────────────────────────┘
Menu Magazzino
┌───────────────────────────────────────────────────────────┐
│ Germinabilità                                             │
│ ─ Analisi ▾ (In Corso, Cerca)     (NO "Nuova")            │
│ ─ Produttore ▾ (Lista, Aggiungi)                          │
│ ─ Lotto ▾ (Setta come esaurito, Aggiungi)                 │
│ ─ Varietà ▾ (Lista, Aggiungi)                             │
│ ─ Specie ▾ (Lista, Aggiungi)                              │
│ ─                                                         │
│            (niente "Amministrazione", niente "Da Analizzare")│
│                                   semiorto ▾  [Esci]      │
└───────────────────────────────────────────────────────────┘

Utenti reali (dal DB live AWS)

UsernameNomeEmailPermessiAttivo
diegoDiego Sorrentinodie.sorrentino@gmail.comAmministrazione Laboratorio
giuseppeGiuseppe Mancusodirezione@semiorto.comAmm. Lab Mag
anaAnalexandra Sansoneanasansone@gmail.comLaboratorio
RICERCACentro Ricerca Formisanoricerca@semiorto.comLaboratorio
semiorto(vuoto)(vuoto)Magazzino

Ricambio password & flusso "cambiaPassword"

Flow di sicurezza al primo accesso:

  1. Admin crea utente da /amministrazione/utente/new
  2. Sistema:
    • Imposta cambiaPassword=true
    • Genera password random 4-8 char (pattern qwerty…QWERTY…1234!)
    • Hash SHA e salva
    • Invia email all'utente con password temporanea
  3. Utente si logga → redirect forzato a /utente/cambioPassword
  4. Cambia password → hash SHA → cambiaPassword=false
  5. Email di conferma cambio
  6. Logout forzato → re-login con nuova password

Stesso flow per reset: admin clicca "Resetta password" sul dettaglio utente → azzeraPassword() rigenera e invia mail.

Policy Spring Security

<intercept-url pattern="/assets/**" access="permitAll" />
<intercept-url pattern="/accesso/**" access="!isAuthenticated()" />
<intercept-url pattern="/**" access="isAuthenticated()" />

Due osservazioni importanti:

  1. Solo isAuthenticated(), zero hasRole(). I ruoli non sono applicati agli URL.
  2. Il menu viene costruito dinamicamente da DB (tabella menu + permesso_menu), quindi ogni utente vede solo le voci permesse, ma se conosce l'URL può comunque accedervi.
⚠ Vulnerabilità authorization bypass

Un utente Magazzino che conosce l'URL /analisis/analisi/new (voce non nel suo menu) può teoricamente accedervi. Questo in Spring Security è risolvibile con:

<intercept-url pattern="/analisis/analisi/new" access="hasRole('Laboratorio')" />
<intercept-url pattern="/amministrazione/**" access="hasRole('Amministrazione')" />

In TopSeed la riscrittura deve applicare controlli sia lato menu sia lato endpoint.

Mapping verso ruoli TopSeed

SemiortoTopSeedNote
AmministrazioneADMINdirect
LaboratorioGENETISTAdirect (o nuovo ruolo LAB)
MagazzinoMAGAZZINIEREdirect
utente con più ruoli (es. Giuseppe)multi-role (TopSeed lo supporta)Giuseppe ha 3 ruoli, diego ne ha 2

Credenziali operative (dopo migrazione)

🔑 Primo login in TopSeed

Gli hash password sono SHA-1 legacy. La migrazione importa gli hash come legacy_sha_hash. Al primo login:

  1. Se l'utente digita password valida (SHA-1 match) → hash rigenerato in bcrypt e salvato
  2. Altrimenti → richiesta reset password via email

Credenziali aggiornate vengono comunicate all'utente via email con template "[Semiorto] Primo accesso TopSeed".