Zobrazení obsahu podle role uživatele

divispet
Člen | 29
+
0
-

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 | 758
+
0
-

@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
+
0
-

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 | 762
+
0
-

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 | 1175
+
0
-

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).

divispet
Člen | 29
+
0
-

@m.brecher, @MarekBartoš

díky za tipy a rady, jdu se s tim teda poIfovat :-)