Zpět na domů

RBAC se stavy v JMatrixPlatform

JMatrixPlatform kombinuje RBAC se stavy objektů pro granulární kontrolu přístupu. Filtrování se aplikuje na SQL úrovni, stavy se auditují. Uvedeny příklady konfigurace rolí, politik a metod promote/demote.

Stavový rolový RBAC v JMatrix: kód a praxe
Advertisement 728x90

RBAC s vazbou na stav objektů v JMatrixPlatform

JMatrixPlatform implementuje model řízení přístupu na základě rolí (RBAC) prostřednictvím vazby oprávnění na stavy objektů. Každý objekt má typ a životní cyklus – posloupnost stavů, které definují jeho aktuální stav. Při vytváření objektu se zadává jeho typ a životní cyklus; počáteční stav je automaticky nastaven jako první stav daného cyklu nebo explicitně přepsán v metodě createAction.

Jeden typ může podporovat více životních cyklů. Například:

| Objekt | Typ | Cyklus | Stav | Dostupné stavy |

Google AdInline article slot

|--------|-------|--------|-----------|----------------------|

| Obj1 | Typ1 | ŽC1 | Stav1 | Stav1*, Stav2 |

| Obj2 | Typ1 | ŽC2 | Stav4 | Stav1–4* |

Google AdInline article slot

| Obj3 | Typ1 | ŽC3 | Stav2 | Stav1–3* |

Typický životní cyklus pro dokumentaci: Návrh → Publikováno → Schválení → Archivováno → Vydáno. Pro referenční data: Nový → Aktivní → Zastaralý.

Změna stavu probíhá buď jako promote (přesun dopředu) nebo demote (přesun zpět), všechny změny jsou auditovány v tabulce object_states:

Google AdInline article slot
create table object_states (
    object_id uuid not null,
    policy_state varchar(100) not null,
    user_id uuid not null,
    state_start timestamp not null,
    state_end timestamp
);

Audit umožňuje analyzovat zpoždění: SELECT user_id FROM object_states WHERE policy_state = ? AND (state_end - state_start) >= ?.

Konfigurace rolí a politik

Role dědí od třídy JRole:

@JModelPart
public final class ARLReferenceAdmin extends JRole {
  public final static ARLReferenceAdmin ROLE = new ARLReferenceAdmin();

  @Override
  public Set<JRole> getParents() {
    return Set.of(ARLRefDesigner.ROLE, ARLRefChangeManagementAdmin.ROLE, ARLRefApprover.ROLE);
  }

  @Override
  public String getDescription() {
    return "Správce referenčních dat";
  }
}

Životní cykly dědí od třídy JPolicy:

@JModelPart
public final class ALCReference extends JPolicy {
  public final static ALCReference POLICY = new ALCReference();

  @Override
  public Set<JType> getTypes() {
    return Set.of(ATPReference.TYPE);
  }
  
  @Override
  public List<JState> getStates() {
    return List.of(New.STATE, Active.STATE, Inactive.STATE);
  }

  public static final class New extends JPolicy.JState {
    public static final New STATE = new New();
    @Override
    public Set<RoleAccess> getAccess() {
      return Set.of(new RoleAccess(ARLReferenceAdmin.ROLE, AccessType.ALL));
    }
  }

  public static final class Active extends JPolicy.JState {
    public static final Active STATE = new Active();
    @Override
    public Set<RoleAccess> getAccess() {
      return Set.of(
        new RoleAccess(JPublic.ROLE, AccessType.READ),
        new RoleAccess(ARLReferenceAdmin.ROLE, AccessType.PROMOTE, AccessType.DEMOTE));
    }
  }

  public static final class Inactive extends JPolicy.JState {
    public static final Inactive STATE = new Inactive();
    @Override
    public Set<RoleAccess> getAccess() {
      return Set.of(
        new RoleAccess(JPublic.ROLE, AccessType.READ),
        new RoleAccess(ARLReferenceAdmin.ROLE, AccessType.DEMOTE));
    }
  }
}

AccessType:

  • ALL: plná kontrola
  • READ: čtení
  • CREATE: vytvoření
  • MODIFY: úprava
  • DELETE: odstranění
  • RELEASE: vydání verze
  • PROMOTE: povýšení stavu
  • DEMOTE: snížení stavu
  • CHECKIN: nahrání souborů
  • CHECKOUT: stažení souborů

Vytvoření objektu:

JDomainObject obj = new JDomainObject();
obj.create(ctx, ATPDocuments.TYPE, ALCDocument.POLICY);

Platforma ověřuje oprávnění k akci CREATE v počátečním stavu. Metody pro změnu stavu:

obj.promote(ctx); // dopředu
obj.demote(ctx);  // zpět

Autorizační mechanismy na úrovni databáze

Role z JWT tokenů jsou integrovány s Keycloakem; filtrace se aplikuje přímo v SQL dotazech. Data jsou oříznuta již na úrovni databáze.

Maximální přístup

JSystemAdmin – bez jakýchkoli kontrol, maximální výkon.

Přístup založený na stavu

Příklad přístupové matice:

| Role | Nový | Aktivní | Zastaralý |

|---------------------|--------------|----------------------------|---------------|

| ARLReferenceAdmin | ALL | READ, PROMOTE, DEMOTE | READ, DEMOTE |

| JPublic | #NOACCESS | READ | READ |

Pro JPublic: WHERE policy_state IN ('ALCReference.Active', 'ALCReference.Inactive').

Pro správce – povolený přístup ke všem stavům. Optimalizace: limit ~100 stavů, plánovaná podpora dočasných tabulek.

Filtrace podle vlastností

Ve vývoji. Rekurzivní kontroly přes vazby jsou výkonnostně neefektivní.

Klíčové body

  • Stavy jsou pevně integrovány do RBAC pro jemnou granularitu řízení přístupu bez nutnosti mazání dat.
  • Audit stavů v tabulce object_states umožňuje analýzu pracovních procesů.
  • Filtrace na úrovni SQL zajišťuje, že data nikdy neopustí databázi bez odpovídajících oprávnění.
  • Akce promote/demote jsou pevně zaznamenávány s uvedením uživatele a času.
  • Synchronizace rolí z Keycloaku do JWT tokenů je nativně podporována.

— Editorial Team

Advertisement 728x90

Číst dál