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 |
|--------|-------|--------|-----------|----------------------|
| Obj1 | Typ1 | ŽC1 | Stav1 | Stav1*, Stav2 |
| Obj2 | Typ1 | ŽC2 | Stav4 | Stav1–4* |
| 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:
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_statesumožň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/demotejsou pevně zaznamenávány s uvedením uživatele a času. - Synchronizace rolí z Keycloaku do JWT tokenů je nativně podporována.
— Editorial Team
Zatím žádné komentáře.