Securitate & autentificare
gNotify are două planuri de autentificare disjuncte, cu lanțuri de securitate Spring separate.
Plan mașină — mTLS PFX (@Order(2))
Section titled “Plan mașină — mTLS PFX (@Order(2))”/api/v1/** autentifică sisteme externe prin TLS mutual cu certificate PFX. security/pfx/PfxAuthenticationFilter oglindește middleware-ul PHP PfxAuthenticate:
- nginx termină TLS și pune headerele
X-SSL-Client-*(amprenta certificatului client); - filtrul normalizează amprenta (minuscule, fără
:/spații) și o compară cuSistem.certFingerprint(hash_equals); Sistem.activ=false→403 System is not active;- în dev, mTLS e ocolit (
gnotify.pfx.auth-disabled=true), cu sistemulbilling-service.
Plan administrare — JWT + Keycloak OIDC (@Order(1))
Section titled “Plan administrare — JWT + Keycloak OIDC (@Order(1))”UI-ul de administrare + /api/** folosesc JWT (HS512) cu Keycloak OIDC dual-auth opțional:
flowchart LR U[Operator/cetățean] --> JWT[POST /api/authenticate<br/>JWT HS512] U --> OIDC[Keycloak realm gnotify<br/>sso.gstack.esempla.systems] JWT --> API[/api/**, UI] OIDC --> API- gated de
gnotify.oidc.enabled; realmgnotify, clientgnotify-web. - portalul cetățean folosește același plan JWT (self-service
/api/registry/me/**).
Roluri & scopare
Section titled “Roluri & scopare”| Zonă | Cerință |
|---|---|
/api/v1/** | mTLS PFX (sistem activ) |
/api/admin/** | ROLE_ADMIN |
/api/providers/** | ROLE_ADMIN |
/api/operator/** | operator autentificat (scopat pe systemId) |
/api/registry/me/** | cetățean autentificat (self-service) |
/api/** | autentificat |
Scopare pe operator (OperatorScopeService, injectat în query-services): un operator legat de un Sistem (Sistem.operatorLogin) vede/gestionează doar resursele sistemului său (șabloane, grupuri, notificări). Logica e scrisă de mână și trebuie re-injectată după regenerare.
/api/v1 — forma erorilor
Section titled “/api/v1 — forma erorilor”/api/v1/** întoarce erori în stil Laravel {"message": …} (via V1ExceptionAdvice, scopat pe pachetul v1). API-ul de administrare păstrează JHipster problem+json.
Jurnal append-only
Section titled “Jurnal append-only”EvenimentNotificare este strict append-only: repository-ul interzice UPDATE/DELETE (AppendOnlyAuditGuard, listener Hibernate care veto-ează), plus trigger DB. Echivalentul log-ului JSON de audit din PHP; fiecare tranziție de status scrie un eveniment.
Certificate
Section titled “Certificate”- Sisteme externe: certificate client PFX, amprenta stocată în
Sistem.certFingerprint. - MNotify:
certs/2026_e-integritate.pfx(eIntegritate/ANI) — gitignored, copt în jar (vezi MNotify-Forwarding). - Certificatele mTLS guvernamentale (
*.pfx) sunt în.gitignore, niciodată comise.