Sari la conținut

Autentificare

Acest conținut nu este încă disponibil în limba selectată.

GLog este un OAuth2 Resource Server: fiecare apel /api/v1/app|admin/** cere un JWT valid din care se derivă autoritățile audit:read|write|admin și claim-ul tenant (izolare multi-tenant — scrierea cu tenantId ≠ tenant din token → 403).

Convertorul GlogJwtAuthConverter acceptă două proveniențe, unificate, ca să meargă identic pentru oameni și pentru servicii:

  • Scope-uri (scope/scp) → SCOPE_*. Clienții de tip serviciu (ex. glog-ingest folosit de GNotify) poartă audit:write pe această cale.
  • Roluri de realm (realm_access.roles) → mapate pe audit:*:
    • ROLE_ADMIN (sau admin) → audit:read + audit:write + audit:admin
    • ROLE_USER (sau user) → audit:read
    • prefixul ROLE_ și majuscularea sunt normalizate.

Modurile sunt exclusive per deployment, selectate prin profil:

ProfilAutentificareIdentitățiCând
localdevocolită (principal sintetic, tenant demo)—dezvoltare locală, fără token
localauthde sine stătătoare — user/parolă, token HS512 auto-emistabela locală app_userdeployment real fără Keycloak
stagingKeycloak resource server (RS256, realm interdictii)realm interdictiiintegrare SSO cu restul gStack
dualauthambele — Keycloak și user/parolă simultanrealm + app_userun deployment cu ambele căi de login

Deployment demo curent: glog.gstack.esempla.systems rulează pe profilul dualauth (Keycloak și user/parolă) cu AMQP activ (RabbitMQ) — după resize-ul box-ului la 8GB. Admin implicit: admin / qweASD123.

Mod localauth — user/parolă (fără Keycloak)

Section titled “Mod localauth — user/parolă (fără Keycloak)”

Permite GLog să ruleze ca implementare reală fără IdP extern. Expune trei endpoint-uri publice sub /api/auth:

MetodăCaleDescriere
POST/api/auth/registerauto-înregistrare → USER read-only; 201 + token; 409 dacă există; 400 la validare
POST/api/auth/loginschimbă credențialele pe un token; 401 la credențiale greșite / cont dezactivat
GET/api/auth/me(Bearer) → {username, tenant, authorities}

Token-ul este un JWT HS512 auto-emis (semnat cu GLOG_AUTH_JWT_SECRET), modelat exact ca un token Keycloak (realm_access.roles + tenant) — de aceea același GlogJwtAuthConverter și aceleași reguli de autorizare se aplică nemodificat.

Admin de bootstrap (GLOG_ADMIN_USER/GLOG_ADMIN_PASSWORD, implicit admin/admin) este creat la prima pornire, ca să existe mereu o cale de intrare — schimbați parola în orice deployment real.

Corpul răspunsului la login/register:

{ "accessToken": "eyJhbGciOiJIUzUxMiJ9…", "tokenType": "Bearer",
"expiresAt": 1753617600, "username": "admin", "role": "ADMIN", "tenant": "demo" }

Configurare (application-localauth.yml, override prin env)

Section titled “Configurare (application-localauth.yml, override prin env)”
VariabilăImplicitRol
GLOG_AUTH_JWT_SECRET— (dev fallback)secret HS512, ≥ 64 caractere. Obligatoriu în prod.
GLOG_AUTH_TOKEN_TTL28800 (8h)durata token-ului (secunde)
GLOG_AUTH_TENANTdemotenant pentru utilizatorii înregistrați + admin bootstrap
GLOG_ADMIN_USER / GLOG_ADMIN_PASSWORDadmin / adminadmin de bootstrap (doar când app_user e goală)

Rulare: SPRING_PROFILES_ACTIVE=localauth,no-amqp.

Mod staging — Keycloak (realm interdictii)

Section titled “Mod staging — Keycloak (realm interdictii)”
  • UI web → client public glog-web (PKCE S256, doar browser).
  • Servicii M2M (ex. GNotify) → client confidențial + grant client_credentials (ex. glog-ingest, scope audit:write).
  • Regulă: browser → client public + PKCE; serviciu → client confidențial.
  • KEYCLOAK_ISSUER_URI=https://sso.gstack.esempla.systems/realms/interdictii.
  • Rulare: SPRING_PROFILES_ACTIVE=staging,no-amqp.

Mod dualauth — Keycloak ȘI user/parolă simultan

Section titled “Mod dualauth — Keycloak ȘI user/parolă simultan”

Un singur resource server acceptă două proveniențe de token, rutate după claim-ul iss de un JwtIssuerAuthenticationManagerResolver:

  • Keycloak (realm interdictii, RS256) — validat față de JWKS-ul realm-ului (KEYCLOAK_ISSUER_URI).
  • local (HS512) — token-uri emise de /api/auth/login, validate cu GLOG_AUTH_JWT_SECRET; iss = glog-localauth.

Ambele trec prin același GlogJwtAuthConverter, deci autorizarea (audit:* + tenant) e identică indiferent de calea de login. Ecranul de login afișează butonul Keycloak ȘI formularul user/parolă. Rulare: SPRING_PROFILES_ACTIVE=dualauth (necesită Postgres + RabbitMQ + issuer Keycloak accesibil); slim: dualauth,no-amqp.

Profilurile localauth/dualauth pornesc stiva completă (DB + RabbitMQ) când sunt rulate fără no-amqp (spring.autoconfigure.exclude: [] re-activează AMQP). Broker dedicat glog-rabbitmq; ingest AMQP: publish pe exchange-ul audit.events (routing key = codul serviciului) → consumatorul stochează evenimentul. Slim (fără broker): adăugați profilul no-amqp.

environment.authMode ∈ { keycloak | local | dual | demo }:

  • local (build --configuration=localauth) → ecran de login user/parolă + înregistrare; token-ul e păstrat în localStorage și atașat ca Bearer.
  • dual (build --configuration=dual) → ambele: buton Keycloak + formular user/parolă.
  • keycloak → fluxul OIDC/PKCE.
  • demo → intrare demo (auth ocolită).

Butonul de Deconectare este ancorat în bara laterală stângă (sub blocul de utilizator): Keycloak → redirect logout la IdP; local/demo → curăță sesiunea → /login.

  • 🔌 API — endpoint-uri funcționale + operaționale
  • Colecție Postman: docs/glog.postman_collection.json (folderul Auth are cererile localauth + client-credentials)
  • Referință integrator: docs/api.md

La zi: 2026-07-27 · surse de cod: config/{SecurityConfig,LocalAuthSecurityConfig,GlogJwtAuthConverter}, web/AuthResource, security/local/*.