Filtrování přístupu k datům pomocí kompletního systému oprávnění

Automaticky přeloženo z Deepl

Filtrování přístupu k datům je nezbytnou funkcí, která zabrání škodlivému přístupu k vaší aplikaci.

Dosud jste mohli vystavit nebo nevystavit jako prostředek REST datovou třídu a některé její atributy. To už byl vhodný prostředek k omezení přístupu k datům. Přesto jsme nadšeni, že můžeme ve verzi v19R8 přinést výkonný a plně přizpůsobitelný systém ochrany vašich dat před neoprávněnými uživateli. Systém ochrany vašich dat závisí na tom, kdo k nim přistupuje a k jakým datům.

Jak jste žádali během výměn názorů se zákazníky, budete nyní moci pracovat s mnoha uživateli pracujícími na různých firmách a vyladit přístup k vašim datům s několika úrovněmi granularity, od nejobecnější až po nejpřesnější.

V návaznosti na škálovatelné webové relace vám tato funkce umožní vytvořit spolehlivou a chráněnou aplikaci.

HDI_Permissions

Obecný kontext

Tato nová funkce vychází z konceptů ORDA a webových relací (přesněji ze škálovatelných webových relací).

Zahrnuje všechny webové procesy, jako jsou požadavky REST a požadavky přijaté ve vzdáleném datovém úložišti, ale také webové procesy, jako je 4DACTION nebo 4D tagy.

Hlavní koncepty

Ve své aplikaci nyní můžete definovat povolená oprávnění.

Oprávnění označuje prostředek a oprávnění spojená s akcemi na tomto prostředku.

Zdroji jsou atribut datové třídy, funkce datového modelu ORDA, datová třída a celé datové úložiště.

Akce jsou: vytvoření, čtení, aktualizace, odstranění, popis, provedení (funkce) a povýšení (funkce).

a Oprávnění pro atribut datové třídy

Atribut personalNotes datové třídy Records lze číst pomocí oprávnění medicalAction.

Resource Records.personalNotes Oprávnění
Čtení medicalAction

oprávnění pro funkci datové třídy

Funkci deleteOldRecords() definovanou v datové třídě Records lze spustit pomocí oprávnění administrate.

Zdroj Records.deleteOldRecords() Oprávnění
Spustit administrate

oprávnění pro datovou třídu

Datovou třídu Records lze číst pomocí oprávnění medicalAction i administrate a entity lze vytvářet pomocí oprávnění medicalAction.

Prostředek Záznamy Privilegia
Číst medicalAction, administrate
Vytvořit medicalAction

oprávnění pro celé datové úložiště

Oprávnění administrate může vypustit entity v libovolné datové třídě datového skladu.

Zdroj ds Oprávnění
Drop administrate

Pro nastavení vlastních pravidel pro oprávnění stačí vytvořit soubor roles.json ve složce Project/Sources vaší aplikace.

Některé role( tj. sadu oprávnění) můžete také sami definovat a přiřadit ke každému uživateli vaší aplikace.

Nezapomeňte, že ke škálovatelné webové relaci můžete přiřadit některá oprávnění. Když pak systém obdrží požadavek, provede se kontrola týkající se oprávnění uživatele uložených ve webové relaci a toho, které akce jsou pro tato oprávnění v souboru roles.json povoleny.

Pokud akce na daném prostředku není povolena, je vyvolána chyba oprávnění.

mechanismus v detailech

Pokud nejsou ve webové relaci nastavena žádná oprávnění, jedná se o relaci hosta. Ve výchozím nastavení jsou pro toto privilegium hosta přístupná všechna data. Také pokud v souboru roles.json nenastavíte žádné oprávnění, jsou všechna data přístupná komukoli.

Poté vstoupí do hry oprávnění nastavená v souboru roles.json a omezí přístup k datům.

Oprávnění lze pro prostředky nastavit na několika úrovních granularity. Tyto prostředky jsou níže uvedeny podle úrovní granularity (od nejobecnější po nejpřesnější):

– datové úložiště
– datová třída
– atribut datové třídy / funkce datové třídy

Práva nastavená na dané úrovni jsou přepsána nebo doplněna právy specifikovanými na přesnější úrovni.

Následující schéma znázorňuje grafičtější zobrazení oprávnění přiřazených k akcím na nějakém prostředku.

Privilegium hosta může spouštět akce na prostředcích, které nejsou spojeny s žádným oprávněním. Přístup k datům omezíte, jakmile přiřadíte privilegium k párovému prostředku/akci.

TIP: Pokud chcete, aby vaše data byla ve výchozím nastavení nedostupná, přiřaďte datovému skladu privilegium nikdo pro všechny akce a zajistěte, aby toto privilegium nebylo nikdy vloženo do relace.

podrobněji na příkladech

Pracujme s tímto jednoduchým datovým modelem.

blank

V této aplikaci chceme tato pravidla implementovat:

  • pouze privilegium administrate může v celém datovém úložišti vypouštět a vytvářet entity
  • datovou třídu Patients může číst pouze privilegium medicalAction
  • atribut Records.personalNotes může číst pouze privilegium medicalAction (i když je datová třída čitelná několika dalšími privilegii)
  • funkce deleteOldRecords() definovaná v datové třídě Records je spustitelná pouze privilegiem administrate
  • zpracovat funkci authenticate() spustitelnou kýmkoli (privilegium guest).

privilegium administrate může vypouštět a vytvářet entity v celém datovém skladu

V níže uvedeném souboru roles.json jsme definovali privilegium administrate. Toto privilegium je oprávněno:

  • drop
  • vytvářet:

entity v celém datastore (všechny datové třídy).

Pouze toto privilegium administrate je oprávněno provádět tyto akce. Protože ve výchozím nastavení jsou všechny akce povoleny na všech datech a my jsme pro datové úložiště nepřidělili žádné privilegium pro akci čtení, může kdokoli číst všechny datové třídy datového úložiště.

{"privileges": [{"privilege":"administrate"}],
  [{}],
 "permissions": 
  "povoleno": [{"applyTo":"ds", "type": "datastore", "drop": ["administrate"], "create": ["administrate"]}]
 }
}

datové třídy pacientů lze číst pouze pomocí privilegia medicalaction

V níže uvedeném souboru roles.json jsme přidali privilegium medicalAction.

Pouze toto privilegium medicalAction je oprávněno číst datovou třídu Patients. Protože je toto oprávnění nastaveno na úrovni datové třídy, je nadřazeno oprávněním nastaveným na úrovni datového úložiště + oprávněním hosta. Tedy pouze privilegium medicalAction může číst datovou třídu Patients. Ostatní datové třídy může číst kdokoli.

{"privileges": {"privilege": "administrate"},{"privilege":"medicalAction"}],
 "roles": [ {} ],
 
  {"allowed": "oprávnění": [
      {"applyTo": "ds", "type": "datastore", "drop": ["administrate"], "create": ["dat"]: ["administrate"] },
      {"applyTo":"Patients", "type": "dataclass", "read": ["medicalAction"] }
  ]
 }
}

atribut records.personalnotes může číst pouze privilegium medicalaction.

V tomto příkladu jsme přidali privilegium readRecords. Protože je privilegium readRecords zahrnuto do privilegia medicalAction, může privilegium medicalAction provádět všechny akce povolené pro privilegium readRecords.

Jak readRecords , tak medicalAction mohou číst datovou třídu Records, ale atribut personalNotes může číst pouze privilegium medicalAction.

{"privileges": [{"privilege": "administrate"}, {"privilege":"readRecords"}, {"privilege":"medicalAction", "includes": ["readRecords"] } ],
 "roles": [ {} ],
 "permissions": {
  "allowed": [
   {"applyTo": "ds", "type": "datastore", "drop": ["administrate"], "create": ["dat"], "dat": ["dat"], "dat": ["dat"]: ["administrate"] },
   {"applyTo": "Patients", "type": "dataclass", "read": ["medicalAction"] },
   {"applyTo":"Záznamy", "typ": "dataclass", "read": ["readRecords"] },
   {"applyTo":"Records.personalNotes", "type": "atribut", "read": ["medicalAction"] } }
  ]
 }
}

Funkci deleteoldrecords datové třídy records může provádět pouze privilegium administrate.

Protože v níže uvedeném příkladu musí mít právo mazat staré záznamy pouze správce systému, přidali jsme pro privilegium administrate oprávnění vykonávat funkci deleteOldRecords() definovanou na datové třídě Records.

Pouze toto privilegium ji může vykonat.

Pro privilegium administrate jsme také přidali oprávnění číst datovou třídu Records, protože čtení entit je nutné k jejich vyřazení.

{"privileges": [ {"privilege":"administrate"}, {"privilege": "readRecords"}, {"privilege": "readRecords": "medicalAction", "includes": "privilegium": "medicalAction", "medicalAction": "privilegium": "medicalAction": ["readRecords"] } ],
 "roles": [ {} ],
 "permissions": {
  "allowed": [
   {"applyTo": "ds", "type": "datastore", "drop": ["administrate"], "create": ["dat"], "dat": ["dat"], "dat": ["dat"]: ["administrate"] },
   {"applyTo": "Patients", "type": "dataclass", "read": ["medicalAction"] },
   {"applyTo": "Záznamy", "typ": "dataclass", "read": ["readRecords","administrate"] },
   {"applyTo": "Records.personalNotes", "type": "atribut", "read": ["medicalAction"] },
   {"applyTo":"Records.deleteOldRecords", "type": "method", "execute": ["administrate" ] }
  ]
 }
}

zpracovat funkci authenticate spustitelnou hostem

Aby cizí uživatel nemohl v naší aplikaci spustit žádnou funkci, omezili jsme spouštění funkcí na úrovni datového skladu na privilegium none (nikdy se nevkládá do webové relace).

V našem systému máme funkci authenticate() (definovanou ve třídě DataStore ), kterou mají uživatelé spouštět při vstupu do aplikace. Přidali jsme oprávnění ke spuštění této funkce authenticate().

Protože ji musí být schopen spustit kdokoli, byla akce spustit nastavena pro oprávnění hosta. Přidali jsme také práva hr, abychom zabránili čtení datové třídy Users někým cizím v aplikaci.

Funkce authenticate() potřebuje přečíst datovou třídu Users, aby zjistila existenci uživatele a jeho heslo. Proto je povýšena s privilegiem hr. Akce promote přidává privilegium ve webové relaci (pouze během provádění funkce).

{"privileges": [ {"privilege": "administrate"}, {"privilege": "readRecords"}, {"privilege": "readRecords": "medicalAction", "includes": "privilegium": "medicalAction", "medicalAction": "privilegium": "medicalAction": ["readRecords"] }, {"privilege": "medical": "readRecords": }, {"privilege":"hr"}, {"privilege": "hr"}, {"privilege": "hr"}, {"privilege": "hr"}, {"privilege": "hr"}, {"privilege": "hr"}:"none"} ],
 "roles": [ {} ],
  {
  "allowed": [
   {"applyTo": "ds", "type": "datastore", "drop": ["administrate"], "create": ["dat"]: ["administrate"], "execute": "datasystém": ["datasystém"], "datasystém": ["datasystém"]: ["none"] },
   {"applyTo": "Patients", "type": "dataclass", "read": ["medicalAction"] },
   {"applyTo": "Users", "type": "dataclass", "read": ["hr"] },
   {"applyTo": "Records", "type": "dataclass", "read": ["readRecords", "administrate"] },
   {"applyTo": "Records.personalNotes", "type": "atribut", "read": ["medicalAction"] },
   {"applyTo": "Records.deleteOldRecords", "type": "method", "execute": ["administrate"] },
   {"applyTo": ds.authenticate "method", "promote": ["hr"], "execute": "administrovat": ["guest"]
   }
  ]
 }
}

fáze autentizace

V souboru roles.json lze definovat role: tj . sadu oprávnění. V níže uvedeném příkladu jsme přidali roli The Secretary (Tajemník) obsahující privilegia createPatient (vytvořit pacienta) a readRecords (číst záznamy).

Uživatelé přidružení k této roli mohou provádět všechny akce povolené pro privilegia createPatient a readRecords (vytvořit nového pacienta a číst záznamy).

{"privileges": [ { {"privilege": "administrate" }, {"privilege":"readRecords" }, {"privilege": "medicalAction", "includes": ["readRecords"] }, {"privilege": "hr"  }, {"privilege": "none"},
  {"privilege":"createPatient" } ],
 "roles": [ {"role":"Sekretář", "privileges": "Role":"Sekretář", "privileges": "Role": "Sekretář": ["createPatient","readRecords" ] } }. ],
 "oprávnění": {
  "povoleno": [
   {"applyTo": "ds", "type": "datastore", "drop": ["administrate"], "create": ["dat"], "dat": ["dat"], "dat": ["dat"]: ["administrate"], "execute": ["none"] },
   {"applyTo": "Patients", "type": "dataclass", "read": "Patients", "dataclass":  ["createPatient"] },
   {"applyTo": "Users", "type": "dataclass", "read": "Users", "dataclass", "read": ["hr"] },
   {"applyTo": "Records", "type": "dataclass", "read": "Users", "Users": ["readRecords", "administrate"] },
   {"applyTo": "Records.personalNotes", "type": "atribut", "read": "PersonalNocons", "type": "atribut", "read": ["medicalAction"] },
   {"applyTo": "Records.deleteOldRecords", "type": "method", "execute": ["administrate"] },
   {"applyTo": "ds.authenticate", "type": "method", "promote": ["hr"], "execute": "authentic": ["hr"], "execute": ["hr"]: }: ["guest"]
  ]
 }
}

Ve vaší aplikaci musíte každého uživatele přiřadit k roli v datové třídě (v tomto příkladu datová třída Users ).

Zde je datová třída

blank

a data

blank

Během fáze ověřování můžete do webové relace vložit oprávnění spojená s touto rolí.

Zde je příklad funkce authenticate().

exposed Function authenticate($identifier : Text; $password : Text) : Text
	
var $user : cs.UsersEntity
	
Session.clearPrivileges()
	
$user:=ds.Users.query("identifier = :1"; $identifier).first()
	
If ($user#Null)
	If (Verify password hash($password; $user.password))
		Session.setPrivileges(New object("roles"; $user.role))
		return "Your are authenticated as "+$user.role
	Else 
		return "Your are authenticated as Guest"
	End if 
Else 
	return "Your are authenticated as Guest"
End if 

Pozorně si přečtěte dokumentaci, abyste se dozvěděli více o oprávněních, a stáhněte si výše uvedený HDI a spusťte ukázkový příklad.

Neváhejte otevřít diskusi na fóru.

Avatar
• Product Owner • Marie-Sophie Landrieu-Yvert se připojila k programovému týmu 4D jako Product Owner v roce 2017. Jako Product Owner má na starosti psaní uživatelských příběhů a jejich převod do funkčních specifikací. Její úlohou je také zajistit, aby implementovaná funkce odpovídala potřebám zákazníka. Marie-Sophie vystudovala inženýrskou školu ESIGELEC a svou kariéru zahájila jako inženýrka v IBM v roce 1995. Podílela se na různých projektech (projekty údržby nebo výstavby) a pracovala jako vývojářka Cobol. Poté pracovala jako UML designer a Java developer. V poslední době byly jejími hlavními rolí analyzovat a psát funkčních požadavky a koordinovat obchodní a vývojové týmy.