ACL

1.12K
.
Koenig, У меня собственная система, думаю дача ссылки на нее будет воспринята как реклама )))
.
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('Доступ запрещен!');
    }
  }
}
.
(\/)____o_O____(\/)
Delphinum, сразу все ясно стало, а то литературным текстом описал , иногда тоже люблю описывать подобно, но когда картинки в голове нет, сложно литературу в код конвертировать
.
Delphinum (18.09.2012/09:05)
Koenig, У меня собственная система, думаю дача ссылки на нее будет воспринята как реклама )))
Не будит, пиши линк.
.
L!MP, http://delphinum.16mb.com/index.php - официальный форум

http://delphinum.16mb.com/file ... w.zip - прямая ссылка на платформу
.
Delphinum, я кажется понял.
Месяц назад, или даже раньше, качал исходники.
.
L!MP, Вполне возможно. За месяц в системе множество изменений. Мой ник Башка на wen, visavi и xwab, но на данном форуме ник был занят )
Всего: 57