Zobrazení obsahu podle role uživatele
- divispet
- Člen | 29
Ahoj,
potřebuji poprvé v Nette řešit obsah podle rolí a jdu si pro radu za zkušenějšíma. V principu potřebuji dosáhnout toho, že určitý obsah vidí jen uživatel s určitými právy, nicméně, pokud přihlášený uživatel nemá práva na obsah tak vidí wrapper obsahu a v něm hlášku, že nemá dostatečná práva.
Otázka zní, jak nejlépe tohle implementovat, protože zatím mě napadá udělat to přes IF v Latte na každém místě kde to bude potřeba. Není jich sice moc, ale jestli existuje nějaká lepší/hezčí možnost tak ji rád využiju
- m.brecher
- Generous Backer | 863
@divispet
udělat to přes IF v Latte na každém místě kde to bude potřeba
Technicky to jde, ale není to ideální míchat do vykreslovací šablony řídící logiku týkající se práv k obsahu.
Ideálně by Jsi měl zajistit omezení přístupu k obsahu již minimálně na úrovni modelu, nebo ještě lépe presenteru. Např. v akci presenteru ověřit práva uiživatele k obsahu (tabulce, konkrétnímu záznamu) a pokud nemá oprávnění, přeskočit čtení dat z modelu a použít šablonu s wrapperem obsahu. To je bezpečnější a přehlednější postup.
O něco složitější je zajistit přístup k vybraným sloupcům tabulky – to ale asi nepotřebuješ že?
Editoval m.brecher (12. 10. 2023 16:45)
- divispet
- Člen | 29
m.brecher napsal(a):
@divispet
udělat to přes IF v Latte na každém místě kde to bude potřeba
Technicky to jde, ale není to ideální míchat do vykreslovací šablony řídící logiku týkající se práv k obsahu.
Ideálně by Jsi měl zajistit omezení přístupu k obsahu již minimálně na úrovni modelu, nebo ještě lépe presenteru. Např. v akci presenteru ověřit práva uiživatele k obsahu (tabulce, konkrétnímu záznamu) a pokud nemá oprávnění, přeskočit čtení dat z modelu a použít šablonu s wrapperem obsahu. To je bezpečnější a přehlednější postup.
O něco složitější je zajistit přístup k vybraným sloupcům tabulky – to ale asi nepotřebuješ že?
Mi jde spise o to jak zaridit vykresleni v latte viz nize (pseudo). Role mam v zajistene, ale jde mi o tu logiku vaykreslovani. Protoze techto pripadu muze byt napric applikaci vice na ruznych mistech
if user->hasRole
include charts.latte
else
include missingPermissionBar.latte
- Kamil Valenta
- Člen | 815
Těch možností je více. Asi mne nenapadá žádný rozumný důvod, proč zatahovat identitu do modelu, který tak ztratí na své obecnosti a nastane problém třeba ve chvíli, kdy bude mít poskytovat data nějakému API nebo jakékoliv jiné vrstvě, která nepochází z presenteru (a identita vůbec neexistuje), cron třeba.
Presenter je vhodné místo, kde to řešit. Pokud by to byly nějaké widgety a v jednom view by byla data, která uživatel vidět smí i nesmí, nabízela by se možnost mít to v komponentách a řešit práva tam.
Pokud ten wrapper s hláškou má být includovaná šablona, podmínce
v latte se nevyhneš, ať už práva vyřešíš jakkoliv.
Jen bych tu podmínku nestavěl tak tvrdě na user->hasRole… protože
jakmile dojde ke změně, že nějaká role nakonec něco víc vidět má,
urefactoruješ se k smrti. Jdi prošláplou cestou a na každém místě se
dotazuj autorizátoru, jestli můžeš.
- Marek Bartoš
- Nette Blogger | 1260
Ifům se prostě nevyhneš, lépe to většinou nejde.
Většinou se oprávnění kontrolují v presenteru nebo komponentě, ale
i jejich šablony jsou okay, pokud to z nějakého důvodu v presenteru nebo
komponentě není praktické.
Ale určitě je lepší kontrolovat privilegia a ne konkrétní role. Role by
měly reflektovat pozice ve firmě a ty se mohou časem měnit. Je mnohem
snazší mít v jednom souboru nebo i databázi přehled, jaká role má jaká
privilegia a v kódu kontrolovat pouze ta, než dohledávat která role co
může v kódu. Obzvlášť, pokud role dědíš (neděď je,
nepotřebuješ to).