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:
Pro pole pro výběr stavu:
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.