dakilla, Я много лет не пишу в процедурном стиле и потому немного поздабыл как это у вас делается ) Постараюсь описать мое решение как получится.
Есть модуль, скажем GuestBook. В этом модуле куча файлов с функциями и т.д. и один файл index.php который содержит приметно такой код:
$action = $_GET['action'];
switch($action){
case 'addMessage':
...
break;
case 'removeMessage':
...
break;
...
}
то есть данный модуль может добавлять сообщения и удалять их. Предположим тебе нужно запретить удаление сообщений для обычного пользователя. Для этого создается роль, на пример User и для нее создается такой запрет: GuestBook::removeMessage. Далее нужно проверить, если в $action задано removeMessage, а для данного пользователя существует запрет GuestBook::removeMessage, то выполняться данный блок не должен.
В БД это будет иметь примерно такой вид:
Users[id, pass]
Roles[id, name]
RoleUser[idUser, idRole]
Rules[id, module, action]
RuleRole[idRole, idRule]
На пример мы имеет такого пользователя: id = 1, pass = 123, имеем роль User: id = 2, name = User, назначаем роль пользователю: RoleUser[idUser = 1, idRole = 2], создаем запрет: Rules[id = 3, module = GuestBook, action = removeMessage], назначаем запрет роли: RuleRole[idRole = 2, idRule = 3]
Теперь все пользователи, которым назначена роль User не смогут обращаться к блоку removeMessage модуля GuestBook.
В блоке можно сделать такую проверку:
$action = $_GET['action'];
accessCheck('GuestBook', $action); // Если доступ запрещен, скрипт не выполнится вообще
switch($action){
case 'addMessage':
...
break;
case 'removeMessage':
...
break;
...
}
Далее нужно только реализовать функцию accessCheck:
function accessCheck($module, $action){
$rules = получаем все запреты доступа для данного пользователя из БД;
foreach($rules as $rule){
if($rule['module'] == $module && $rule['action'] == $action){
throw new RuntimeException('Доступ запрещен!');
}
}
}