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; }
* тот-же список, но указав разрешено или нет то или иное действие.
*
* @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. Каждый из них делают по своему. Возможно Вам понравится один из способов.