Ruoli & Menu
Mappatura completa ruoli → voci menu, utenti reali, policy di sicurezza
I 3 ruoli
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)
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
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 menu | URL | Amministrazione | Laboratorio | Magazzino |
|---|---|---|---|---|
| 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
┌──────────────────────────────────────┐ │ Germinabilità │ │ ─ Amministrazione ▾ │ │ └ Utenti │ │ └ Analisi Cancellate │ │ ─ Analisi │ │ ─ │ │ diego ▾ [Esci]│ └──────────────────────────────────────┘
┌──────────────────────────────────────┐ │ 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] │ └──────────────────────────────────────┘
┌───────────────────────────────────────────────────────────┐ │ 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)
| Username | Nome | Permessi | Attivo | |
|---|---|---|---|---|
diego | Diego Sorrentino | die.sorrentino@gmail.com | Amministrazione Laboratorio | ✅ |
giuseppe | Giuseppe Mancuso | direzione@semiorto.com | Amm. Lab Mag | ✅ |
ana | Analexandra Sansone | anasansone@gmail.com | Laboratorio | ✅ |
RICERCA | Centro Ricerca Formisano | ricerca@semiorto.com | Laboratorio | ✅ |
semiorto | (vuoto) | (vuoto) | Magazzino | ✅ |
Ricambio password & flusso "cambiaPassword"
Flow di sicurezza al primo accesso:
- Admin crea utente da
/amministrazione/utente/new - 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
- Imposta
- Utente si logga → redirect forzato a
/utente/cambioPassword - Cambia password → hash SHA →
cambiaPassword=false - Email di conferma cambio
- 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:
- Solo
isAuthenticated(), zerohasRole(). I ruoli non sono applicati agli URL. - 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.
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
| Semiorto | TopSeed | Note |
|---|---|---|
| Amministrazione | ADMIN | direct |
| Laboratorio | GENETISTA | direct (o nuovo ruolo LAB) |
| Magazzino | MAGAZZINIERE | direct |
| utente con più ruoli (es. Giuseppe) | multi-role (TopSeed lo supporta) | Giuseppe ha 3 ruoli, diego ne ha 2 |
Credenziali operative (dopo migrazione)
Gli hash password sono SHA-1 legacy. La migrazione importa gli hash come legacy_sha_hash. Al primo login:
- Se l'utente digita password valida (SHA-1 match) → hash rigenerato in bcrypt e salvato
- Altrimenti → richiesta reset password via email
Credenziali aggiornate vengono comunicate all'utente via email con template "[Semiorto] Primo accesso TopSeed".