Omezení dat podle oprávnění nebo informací uložených v úložišti relace.

Automaticky přeloženo z Deepl

Při vývoji moderních aplikací je zabezpečení a přesná správa přístupu k datům zásadní. Díky události restrict ve 4D je možné dynamicky filtrovat data přístupná uživateli na základě jeho profilu, oprávnění a informací uložených v relaci.

Tento blog vysvětluje, jak tuto událost využít, zejména v kontextu integrace s aplikací 4D Qodly Pro, aby bylo zajištěno, že budou zpřístupněna pouze relevantní data.

Performance Review Application

Porozumění události restrict

Událost restrict je automatický mechanismus filtrování aplikovaný na entity datové třídy v ORDA. Spouští se za účelem omezení výsledků dotazů (all(), query(), přístupu k API REST atd.) na základě konkrétního kontextu (informace o uživateli, oprávnění atd.).

Klíčové přínosy:

  • Dynamické filtrování: Při každém provedení dotazu se automaticky použije filtr definovaný pomocí funkce restrict.
  • Granulární řízení přístupu: Přístup lze plně omezit nebo omezit na konkrétní záznamy na základě uživatelských rolí, oprávnění nebo kontextových údajů, jako je zeměpisná poloha nebo oddělení.
  • Oddělení logiky: Implementace tohoto filtrování je nezávislá na obchodní logice aplikace, což usnadňuje údržbu a aktualizace zabezpečení.

Podrobnější informace o této funkci naleznete v oficiální dokumentaci 4D k filtrování entit.

Oprávnění vs. omezení: Hlavní rozdíly

Ve 4D je řízení přístupu řízeno prostřednictvím oprávnění a omezení, která společně zajišťují bezpečný a granulární přístup k datům. Pochopení rozdílu mezi těmito dvěma mechanismy je klíčové pro návrh robustního bezpečnostního modelu.

Privilegia: Řízení přístupu k datovým strukturám

Oprávnění určuje, zda je uživatel oprávněn přistupovat k tabulce, poli nebo funkci v databázi. Funguje jako mechanismus řízení přístupu na vysoké úrovni, který uděluje nebo zamítá přístup k celé datové sadě nebo funkci.

Příklady použití:

  • Základní uživatel může mít přístup k tabulce Employee pouze pro čtení, ale nemůže upravovat nebo mazat záznamy.
  • Manažer může mít další oprávnění, která mu umožňují upravovat záznamy zaměstnanců v rámci jeho oddělení.
  • Správce lidských zdrojů může mít přístup k citlivým polím, jako jsou informace o platu, zatímco standardní zaměstnanci tyto údaje nevidí.

Omezení: Zpřesnění přístupu na úrovni záznamů

Zatímco oprávnění řídí přístup na strukturální úrovni, omezení určují, které konkrétní záznamy v rámci autorizované tabulky může uživatel vidět nebo s nimi pracovat. Událost on restrict dynamicky filtruje data na základě kontextu uživatele a zajišťuje, že uživatelé mají přístup pouze k relevantním záznamům při respektování předem definovaných bezpečnostních pravidel.

Příklady použití:

  • Spolupracovník má přístup pouze ke svým záznamům v tabulce Zaměstnanci.
  • Manažer může prohlížet záznamy svých přímých podřízených.
  • Správce lidských zdrojů může mít přístup ke všem zaměstnancům.

Případy použití

Příklad 1: Kombinace oprávnění a kontextu relace pro omezení dat

V tomto příkladu implementujeme událost restrict v rámci datové třídy Employee, abychom mohli filtrovat vrácený seznam zaměstnanců. Následující kód ilustruje, jak použít informace o relaci a oprávnění k určení přístupu k datům:

Function event restrict() : cs.EmployeeSelection
var $obj : Object
If (Session=Null)
  $obj:=Storage
Else
  $obj:=Session.storage
End if
Case of
  : (Session.hasPrivilege("authentify"))
   return This.all()
  : (Session.hasPrivilege("generatePDF"))
   return This.all()
  : (Session.hasPrivilege("createReview"))
   return This.all()
  : (Session.hasPrivilege("webadmin"))
   return This.all()
  : ($obj.Employee.role="Collaborator")
   return This.query("ID = :1"; $obj.Employee.ID)
  : ($obj.Employee.role="Manager")
   return This.query("ID_Supervisor = :1"; $obj.Employee.ID)
  : (($obj.Employee.role="HR") && (Session.hasPrivilege("hr")))
   return This.all()
  Else
   return This.newSelection()
End case

Jak to funguje

  • Filtrování na základě oprávnění: The hasPrivilege() ověřuje, zda relace uživatele obsahuje určitá oprávnění. Například zaměstnanci personálního oddělení s oprávněním „hr“ získají přístup ke všem záznamům o zaměstnancích.
  • Dočasné povýšení rolí: U akcí, jako je ověřování, generování dokumentů nebo vytváření přehledů, může povýšení privilegií dočasně udělit rozšířená práva, aniž by se změnilo globální nastavení uživatele.
  • Filtrování na základě relace: Vlastnost role (uložená buď v úložišti Storage, nebo v úložišti Session) určuje úrovně přístupu. Spolupracovníci mohou vidět pouze své vlastní záznamy, manažeři mají přístup k podřízeným zaměstnancům a personalisté mohou zobrazit všechny zaměstnance.
  • Zabezpečený výchozí návrat: Pokud nejsou splněny žádné podmínky, This.newSelection() zajistí, že uživatel nedostane žádná data, nikoli neomezený přístup.

Poznámka: Privilegium webadmin používá Průzkumník dat v programu 4D. Pokud chcete, aby vaše data byla přístupná prostřednictvím Průzkumníka dat, musíte zpracovat případ pro privilegium webadmin. V našem příkladu udělíme plný přístup k Průzkumníku dat tím, že při přítomnosti tohoto privilegia vrátíme This.all().

Příklad 2: Integrace v Qodly Studio pomocí standardních akcí nebo funkcí

Tento druhý příklad ukazuje, jak omezit přístup k recenzím v datové třídě Review na základě role uživatele.

Function event restrict() : cs.ReviewSelection
var $obj : Object
If (Session=Null)
  $obj:=Storage
Else
  $obj:=Session.storage
End if
If ($obj.Employee.role=Null)
  return Null
End if

Case of
  : (($obj.Employee.role="HR") && (Session.hasPrivilege("hr")))
   return This.all().orderBy("Date desc")

  : ($obj.Employee.role="Manager")
   return This.query("Employee.ID_Supervisor = :1"; $obj.Employee.ID).orderBy("Date desc")

  : ($obj.Employee.role="Collaborator")
   return This.query("ID_Employee = :1"; $obj.Employee.ID).orderBy("Date desc")

  : (Session.hasPrivilege("webadmin"))
   return This.all()

Else
  return This.newSelection()
End case

Použití standardních akcí

Na stránce spolupracovníka aplikace Qodly má uživatel roli spolupracovníka a může nahlížet pouze do svých vlastních recenzí.

V aplikaci Qodly Studio definujeme standardní akci Vše pro vyplnění datové tabulky při události načtení stránky spolupracovníka. Za normálních okolností standardní akce Vše načte všechny recenze. Protože jsme však do datové třídy recenzí přidali událost omezit. Získáme pouze recenze autorizované rolí spolupracovník.

Použití vlastních funkcí

Na stránce Manažer mohou uživatelé s rolí „Manažer“ zobrazit všechny recenze týkající se jejich podřízených. Přidali jsme funkci pokročilého filtrování, která umožňuje upřesnit výsledky podle roku a stavu.

V datové třídě Review máme funkci loadReviews:

exposed Function loadReviews($departement : cs.DepartementEntity; $year : Integer; $status : cs.ReviewStatusEntity) : cs.ReviewSelection
Case of
  : (($departement=Null) && ($status=Null))
   return This.query("Date >= :1 AND Date <= :2"; String($year)+"/01/01"; String($year)+"/12/31")

  : (($departement#Null) && ($status=Null))
   return This.query("Employee.ID_Departement = :1 AND Date >= :2 AND Date <= :3"; $departement.ID; String($year)+"/01/01"; String($year)+"/12/31")

  : (($departement=Null) && ($status#Null))
   return This.query("ID_Status = :1 AND Date >= :2 AND Date <= :3"; $status.ID; String($year)+"/01/01"; String($year)+"/12/31")

  : (($departement#Null) && ($status#Null))
   return This.query("Employee.ID_Departement = :1 AND ID_Status = :2 AND Date >= :3 AND Date <= :4"; $departement.ID; $status.ID; String($year)+"/01/01"; String($year)+"/12/31")

Else
  return This.newSelection()
End case

V aplikaci Qodly Studio je tato funkce spouštěna událostí on data change (změna dat) pro datové zdroje rok a stav.

Pro vstupní údaje roku:

blank

Pro pole pro výběr stavu:

blank

Přizpůsobený filtr je kombinován s globálním omezením poskytovaným funkcí on restrict, což umožňuje zpřesnit výsledky při respektování předem definovaných bezpečnostních pravidel.

Další

Událost restrict ve 4D se ukazuje jako mocný nástroj pro dynamickou správu přístupu k datům. Využitím uživatelských oprávnění a úložiště relací zajišťuje granulární řízení přístupu, aniž by zvyšovala složitost obchodní logiky. Integrace s doplňkovými mechanismy, jako je promote, a přidání vlastních filtrů navíc zajišťují větší flexibilitu při plnění specifických požadavků.

Chcete-li prohloubit své znalosti tohoto tématu, podívejte se na oficiální dokumentaci k entitám ORDA a také na blog 4D věnovaný filtrování dat.

Vanessa Talbot
• Product Owner • Vanessa Talbot se připojila k programovému týmu 4D v červnu 2014. 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. Od svého příchodu pracovala na definování klíčových prvků ve 4D. Pracovala na většině nových funkcí preemptivního multi-threadingu a také na velmi složitém tématu: nové architektuře pro enginované aplikace. Vanessa má titul z Telecom Saint-Etienne. Svou kariéru začala ve Výzkumném ústavu kriminalistickém jako vývojářka pro audiovizuální oddělení. Působila také v mediální a lékařské oblasti jako expertka na technickou podporu, produkci i dokumentaci novinek.