Díky za reakce. Taky jsem dospěl k názoru, že to předpočítávání bude v rámci možností nejoptimálnější. Jen teď ještě uvažuji nad dvěma věcmi. 1) Zda.li bude lepší mít jednu centrální tabulku do které se budou zapisovat předpočítaná práva objektů všech tříd i uživatelů, nebo pro každou třídu (tabulku) mít i separátní tabulku předpočítaných práv, či dokonce ty předpočítaná práva ukládat do stejné tabulky jako vlastní data záznamu (to ale asi ne). Analyticky to směřuje k jedné třídě a mapovací tabulce pro všechny entity, ale záznamů přes všechny třídy a uživatele bude velké množství, řádově miliony, tak to spíš s ohledem na výkon vidím na separátní tabulky pro každou entitu. 2) Pro které uživatele předpočítávat. Vzhledem k tomu, že jich může být zavedeno stovky (ne-li tisíce), ale jen část bude aplikaci využívat souběžně, zatím preferuji předpočítávat jen těm uživatelům, kteří byli v nějakém timeoutu přihlášení, aby se zbytečně databáze neplnila právy uživatelů, kteří do ni vlezou jednou za měsíc a to ještě jen na některé moduly. V praxi to ale bude mít za následek, že po přihlášení uživatele, který déle v systému nebyl, bude muset čekat až se mu předpočítají práva modulu do kterého chce zrovna vstoupit. Asi to ale bude přece jen menší zlo než držet v každém okamžiku pořád aktualizovanou kombinaci práv všech tříd, záznamů a uživatelů.
> ------------ Původní zpráva ------------ > Od: Podlesak Kamil <[email protected]> > Předmět: RE: Agenda prístupových práv > Datum: 06.8.2009 10:49:26 > ---------------------------------------- > Zdravím, > > Předpočítat. Nic lepšího jsme nevymysleli a ani jsem nikde nic lepšího > neviděl. > Výkonostně to zas takový problém nebývá, pokud se při typickém provozu jen > vytvářejí/mění záznamy po jednom. Nejhorší je změna rolí uživatele, to se musí > pro něj předpočítat všechna data, ale to se naštěstí zas tak často neděje. > > Jediné sofistikovanější řešení mě napadá, pokud by ten systém počitání práv > nebyl zcela obecný, ale šlo by ho definovat jako nějakou algebru ve které by > se > pravidla zapisovala. Pak by šlo z těch pravidel vygenerovat nejenom kdo má > jaká > práva na co, ale také jak se která změna projeví a na čem - tím by se ušetřilo > spousta času a výkonu zbytečně stráveného přepočítání práv pro objekty, na > která > se ve skutečnosti práva nezměnila. > > Kamil Podlešák > > > -----Original Message----- > > From: [email protected] > > [mailto:[email protected]]on Behalf Of [email protected] > > Sent: Wednesday, August 05, 2009 9:11 AM > > To: [email protected] > > Subject: OT: Agenda prístupových práv > > > > > > 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 > > > > >
