Прав си, осигуряването на страница и обезопасяването на елементи е различно.
Според мен и на практика смятам, че обвързването на всеки код с роля или потребител всъщност е грешен подход. Вместо това, свържете разрешенията към елементи и страници - след това свържете ролите с тези разрешения. И разбира се, на потребителите се присвояват роли.
Важно е да имате и трите :
- Потребители
- Роли
- Разрешения <-- това е, което ви липсва
Разрешенията са това, което защитава елементи и страници, не роли или потребители Вашият код не трябва да има представа (защото не е необходимо) какви потребители или роли има – само имена на разрешения.
Когато потребител влезе, аз грабвам ролята му(ите). След това вземам всички разрешения, които са присвоени на тези роли (просто списък със стойности на низове).
Например на страница, която може да имам:
- Добавяне на елемент
- Преглед на елемента
- Изтриване на елемент
Когато кодирам тази страница, всъщност защитавам всеки от тези елементи с низове за разрешение, наречени подобно ( addItem, viewItem, deleteItem).
<cfif listContainsNoCase( session.permissions, 'addItem' )>
<!--- code to add item --->
</cfif>
(Забележка:Препоръчвам да използвате персонализиран маркер или функция за това, но за целите на примера горното работи добре).
Ако го направите по този начин, той осигурява максимална гъвкавост и абстракция. Ако осигурявате елементи въз основа на ролите, вие се ограничавате :
- Добавянето на нови роли ще изисква много промени в кода!
- Промяната на разрешенията между ролите изисква много промени в кода!
Ако го направите, както беше споменато по-горе, никога няма да се наложи да променяте кода си за защита в кодовата база, тъй като разрешението „addItem“ винаги трябва да е в логиката „добавяне на елемент“, нали? :)
Сега, ако се наложи да създадете роля от типа "мениджър", която има всички потребителски роли и няколко избрани администраторски права, просто създавате тази роля и й присвоявате правилните разрешения (може би addItem и editItem, но не и deleteItem) . Бам! Сега имам роля на мениджър, която да присвоя на потребители с без промени в кода !
Ако бях поръсил кода си с неща от типа "потребител ли е тази роля" - щях да отида да редактирам кода си навсякъде, за да позволя на новата си роля "мениджър" - мамка му!
Има ли смисъл?
=)