PHP « Права пользователей

Делая систему пользователей (разделены по группам) необходимо им давать права на различные действия, будь то добавление новостей, комментирование или же изменения настроек сайта.

Как лучше это реализовать?

Сейчас лишь вижу вариант создать таблицу в базе, с указанием какая группа что может делать, т.е. что-то вроде такого:
group id | can post news | can edit all news | can edit own news | can comment news...
все поля boolean типа, за исключением group id.

Теперь, зная к какой группе относится пользователь ему назначаем права из таблицы.

Но тут возникает вопрос, если прав на различные действия много (50-100) стоит ли опеределять какие именно права нужны на странице? (т.е. если это модуль форума, то только права с форумом, если новости, то соответственно все права для работы с новостями).

Получится что-то на подобии этого:

/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .php.geshi_code {font-family:monospace;} .php.geshi_code .imp {font-weight: bold; color: red;} .php.geshi_code .kw1 {color: #b1b100;} .php.geshi_code .kw2 {color: #000000; font-weight: bold;} .php.geshi_code .kw3 {color: #990000;} .php.geshi_code .co1 {color: #666666; font-style: italic;} .php.geshi_code .co2 {color: #666666; font-style: italic;} .php.geshi_code .co3 {color: #0000cc; font-style: italic;} .php.geshi_code .co4 {color: #009933; font-style: italic;} .php.geshi_code .coMULTI {color: #666666; font-style: italic;} .php.geshi_code .es0 {color: #000099; font-weight: bold;} .php.geshi_code .es1 {color: #000099; font-weight: bold;} .php.geshi_code .es2 {color: #660099; font-weight: bold;} .php.geshi_code .es3 {color: #660099; font-weight: bold;} .php.geshi_code .es4 {color: #006699; font-weight: bold;} .php.geshi_code .es5 {color: #006699; font-weight: bold; font-style: italic;} .php.geshi_code .es6 {color: #009933; font-weight: bold;} .php.geshi_code .es_h {color: #000099; font-weight: bold;} .php.geshi_code .br0 {color: #009900;} .php.geshi_code .sy0 {color: #339933;} .php.geshi_code .sy1 {color: #000000; font-weight: bold;} .php.geshi_code .st0 {color: #0000ff;} .php.geshi_code .st_h {color: #0000ff;} .php.geshi_code .nu0 {color: #cc66cc;} .php.geshi_code .nu8 {color: #208080;} .php.geshi_code .nu12 {color: #208080;} .php.geshi_code .nu19 {color:#800080;} .php.geshi_code .me1 {color: #004000;} .php.geshi_code .me2 {color: #004000;} .php.geshi_code .re0 {color: #000088;} .php.geshi_code span.xtra { display:block; }
/** get_permissions - функция получив список необходимых прав, возвращяет
 * тот-же список, но указав разрешено или нет то или иное действие.
 *
 * @param array $perm_list - массив со списком необходимых прав пользователя.
 * @param int $group_id - id группы, к которой относится пользователь.
 * @return array - массив с правами пользоватя.
 */

function get_permissions($perm_list, $group_id) {
  $query_select = '';
  foreach($perm_list) {
    $query_select .= $perm_list.',';
  }
 
  $result = mysql_query('SELECT' . $query_select . ' FROM groups WHERE group_id=' . $group_id);
 
  return array_of_result($result);
}

// создаём список необходимых прав
$per_list = array('can_post_news', 'can_edit_own_news', 'can_edit_all_news', 'can_comment_news', 'can_edit_own_comments');

// получаем список прав
$permissions = get_permissions($per_list, $user_group_id);

// применяем права
if($permissions['can_comment_news'] == true) {
  // отображаем форму комментиривания новости.
} else {
  echo 'У вас нету прав на комментирование новости';
}


Стоит ли с этим заморачиваться? Или проще сделать функцию, которая будет возвращать все 100 прав, независимо от модуля (новости, статьи, форум...)?

1 ответов


Вобщем, вы только что рассказали самый примитивный простой способ управления правами доступа. У него есть очевидный минус - огромное количество проверок и параметров, которые придется с собой таскать между функционалом.

Существует огромное количество способов управления и разграничения доступом. Я бы крайне рекомендовал бы обратится к примерам реализации. Тут речь идет не только о том, как проверять и как сохранять данные о доступе, но об архитектуре приложения в целом.

Следует не забывать, что такие "приложения" с разграничения начинаются на этапе проектирования.

К примеру, можно:
* реализовавывать каждый из модулей (новости, статьи, форум) так, что они являются прототипами класса в которых реализован функционал проверки доступа к методам.
* использовать "битовую" систему хранения доступа.
* использовать многоуровневую иерархию

К примеру, при описании модуля, мы инициализируем битовую последовательность доступа к ему самому.
И определенные методы управления данными (сохранение, удаление, редактирование....) так же снабжены проверками текущего уровня доступа с уровнем доступа модуля и метода.

Вобщем, раскладывать тут можно бесконечно.
Посмотрите, к примеру, как это сделано в wordpress или joomla или drupal. Каждый из них делают по своему. Возможно Вам понравится один из способов.