Ahoj,

vyvíjíme standartní obchodní evidenční systém s trochu sofistikovanější agendou 
přístupových práv, ktará je postavena na přístupových rolích uživatelů a vztahů 
těchto rolí k jednotlivým entitním objektům (uloženým záznamům v db) systému. 
Oprávnění na každou operaci (CRUD) na daném objektu se vyhodnocují podle 
složitých pravidel závislých na hodnotách jejích atributů a jejich vztahu k 
rolím přiděleným danému uživateli. Navíc se role mohou různě sčítat apod, 
zkrátka pravidla a algoritmy pro vyhodnocení povolení operace nad daným 
záznamem pro konkrétního uživatele jsou dost složitá. Analyticky máme celý 
systém vytvořen, ten zjednodušeně pro každý záznam  vyhodnotí přístupová práva 
pro daného uživatele a případně povolí nebo zamítne požadovanou operaci. 
Nastává však problém v návrhové rovině, např. při generování seznamů. Pokud 
bude chtít uživatel zobrazit stránkovatelný seznam všech záznamů, musí se mu 
samozřejmě zobrazit jen ty, u kterých má právo čtení. Nedokážu si z 
výkonostního hlediska představit, že pro každý uložený záznam, kterých můžou 
být  i miliony, budu až při generování seznamu ověřovat, zda jej má užvatel 
právo zobrazit nebo ne, pro každý záznam by se pak spouštěly složité algoritmy 
pro ověření práv a pokud by měl ve finále uživatel právo třeba na méně záznamů 
než kolik je zobrazovaných záznamů na stránku musely by se projít třeba i 
všechny záznamy. Zatím se jako jedno z řešení jeví, předpočítávat si konečná 
oprávnění pro danou operaci, uživatele a záznam někde na pozadí, ukládat si je 
do nějaké pomocné tabulky a při generování seznamu prostě jen tuto tabulku 
připojit. Toto ale zase vyvolává problém s aktualizacemi těchto pomocných 
tabulek, pokud se v runtime stane něco co by mohlo mít vliv na konečná 
oprávnění (např. změna rolí uživatelů, pravidel vyhodnocenování apod), budou se 
muset celé aktualizovat, což při celkovém počtu entit systému X (stovky) počet 
záznamů každé enity (statisíce) X počet uživatelů (tisíce)  bude opět znamenat 
výkonostní problém. Myslím, že tady už určitě někdo řešil něco podobného, proto 
bych byl vděčen za jakékoliv poznatky jak to třeba řešíte vy.

Díky

Odpovedet emailem