Sari la conținut

Multi-Tenancy

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

Fiecare organizație este un spațiu izolat. Operatorii, bucket-urile și documentele unei organizații nu sunt vizibile din altă organizație. Partajarea între organizații se face doar explicit, prin PartajareDocument.

Rezolvate per-request din AppUser + authority-uri + BucketAcces (security/tenant/TenantContextResolver).

flowchart TD
A{ROLE_ADMIN?} -->|da| B{organizatie == null?}
A -->|nu| C{organizatie != null?}
B -->|da| SA[SERVICE_ADMIN<br/>vede tot]
B -->|nu| OA[ORG_ADMIN<br/>o singură organizație]
C -->|da| BU[Utilizator de bucket<br/>doar bucket-urile asignate]
C -->|nu| CET[Cetățean<br/>public + proprii + partajări]
TierCineVede
SERVICE_ADMINROLE_ADMIN + fără organizație (ex. admin, securizat)tot (toate org/bucket/nivele)
ORG_ADMINROLE_ADMIN + organizațietoată organizația sa (toate bucket-urile ei)
Utilizator de bucketROLE_USER + organizație + BucketAccesdoar bucket-urile asignate + proprii + partajări
CetățeanROLE_USER + Client, fără organizațiepublic + proprii + partajări

La login se mint authority-uri derivate: ROLE_SERVICE_ADMIN / ROLE_ORG_ADMIN (ambele căi: JWT și OIDC). Rolurile la nivel de bucket (ADMIN/OPERATOR) sunt bazate pe date (BucketAcces), NU authorities.

Peste nivelurile L1/L2/L3, în DocumentAccessControl.readableSpecification():

  • SERVICE_ADMIN → vede tot (inclusiv L3).
  • Legat de organizație (ORG_ADMIN / utilizator de bucket) → scope:
    • ORG_ADMIN: document.organizatie == organizația mea
    • utilizator de bucket: document.bucket ∈ bucket-urile mele
    • scope-ul acoperă L1+L2; L3 tot cu clearance + grant explicit, chiar și în propria organizație.
  • Cetățean / anonim → public + proprii + emitent + partajări (fără scoping pe tenant; anonimul vede portalul public L1 global).

Notă (izolare strictă): un utilizator legat de o organizație vede doar documentele PUBLICE ale ORGANIZAȚIEI SALE. Portalul public (utilizatori anonimi, /api/public/**) rămâne global.

Stocare per-bucket (bring-your-own S3/MinIO)

Section titled “Stocare per-bucket (bring-your-own S3/MinIO)”

Fiecare Bucket poate avea propria conexiune de stocare:

  • provider (MINIO/S3), endpoint, regiune, accessKey, secretKeyEnc (AES-criptat, niciodată returnat).
  • endpoint gol → se folosește MinIO-ul implicit al platformei.
  • StorageService/MinioStorageService rutează per bucket fizic (client cache per endpoint); BucketStorageResolver decriptează secretul și construiește StorageTarget.
  • Upload/download/arhivare folosesc bucket-ul fizic al documentului.
  • Pagina „Organizații & bucket-uri” (/organizatii, sub Administrare):
    • Organizații: creare/editare/statut (SERVICE_ADMIN).
    • Bucket-uri: creare/editare (ORG_ADMIN pe org proprie, SERVICE_ADMIN oriunde), config S3/MinIO, mutare bucket între organizații; rânduri expandabile cu membri (grant/revoke OPERATOR/ADMIN).
  • Pagina Utilizatori (/utilizatori): coloană „Organizație” + tab „Editare” → asignare user→organizație.
  • Endpoint-uri: vezi API-Reference → secțiunea Multi-tenancy.
  • Seed demo (DemoDataInitializer) creează organizații/bucket-uri/documente pe bază de date goală.
  • MultiTenancyBackfill (@Order 21) migrează instanțele deja populate: creează ORG-DEFAULT + bucket default și mută documentele/operatorii existenți acolo.