Вообще меня очень смущает if-else скрипт, реагирующий на роли. То есть:
if($role == 1){
...
}
elseif($fole == 2){
...
}
...
Расширение или сужение ролей потребует переписывание кода. Да, такой код будет более гибким в плане возможной реализации, но он тесно связан с самим понятием Роли. А что, если необходимо добавить возможности модеру или юзеру? Или убрать их? Сразу лезть в довольно большой скрипт (скажем форума) и копаться в нем.
В своей системке я реализовал все несколько иначе. Есть модуль, на пример Forum, контроллер данного модуля имеет набор доступных методов, скажем:
addMessage,
deleteMessage,
updateMessage
и др.
Эти методы изначально доступны всем пользователям системы, но благодаря модулю разграничения прав доступа можно определить роли и права доступа к методам всех модулей. Это выглядит примерно так: есть стандартные роли: Default user role (гость), User role (зарегистрированный пользователь), Administrator role (администратор) - есть так же дополнительные роли, определяемые самим модулем при его установке.
Каждая роль имеет неограниченное число прав доступа, на пример роль Default user role имеет такие права доступа:
Forum::addMessage, Forum::deleteMessage, Forum::updateMessage. Это означает, что если незареганый пользователь обратиться к любому методу контроллера модуля Forum, то доступ ему не дадут. Роль User role имеет такие права: Forum::deleteMessage, Forum::updateMessage - то есть обычный пользователь может только добавлять сообщения. Соответственно у админа нет никаких ограничений, то есть роль Administrator role не расширена правами доступа на модуль Forum.
Такая архитектура позволяет полностью исключить вызов недозволенного модуля.
С другой стороны, есть модуль определяющий права доступа на уровне не модели, а представления - Visibility - данный модуль отвечает за отображения тех или иных компонентов пользовательского интерфейса. То есть простой пользователь не видит кнопок админа и т.д. Если же он путем JS отправит запрос на уровень модели в обход модуля Visibility, то запрос будет запрещен модулем Access, который я описал выше.
В частности модуль Visibility работает аналогично модулю Access с той лишь разницей, что запрещает доступ к экранам, а не методам контроллеров. Создаются отдельные экраны для админа и пользователя, а пользователю запрещается видить экран админа. Если он запросит его, то система сообщит о 404.