Управление правами пользователей на PHP Версия для печати
 
Данная статья описывает способ управления правами доступа посетителей к страницам и функциям сайта. Назначая права доступа, мы можем гибко регулировать возможности посетителей. Посмотреть реальный пример использования такой системы можно на сайте http://compadmin.ru. Вариантов разделения прав доступа много, можете использовать какой больше нравится. Это лишь пример.

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

Итак:
0 - ничего нельзя
1 - разрешено удаление
2 - разрешено редактирование
3 - разрешено редактирование и удаление
4 - разрешен просмотр
5 - разрешены просмотр и удаление
6 - разрешены просмотр и редактирование
7 - разрешено все

Наши права доступа будут состоять из ряда чисел от нуля до семи, где каждое число означает права доступа к странице и ее функциям.

Информация, какое число из ряда соответствует какой странице, запишем в таблицу прав доступа. Допустим, у нас есть панель управления, состоящая из 3-х страниц: news.php, tovars.php и contacts.php. Создадим таблицу прав доступа:

Code

<?
$dostup[1] = "Новости";
$dostup[2] = "Товары";
$dostup[3] = "Контактная информация";
?>

Предположим, имеем пользователя user с привилегиями 754. Разберем его привилегии:

7 - это первое число в правах доступа пользователя, ему соответствует страница Новости из таблицы прав доступа. Число 7 означает, что разрешено все, следовательно пользователь user может просматривать новости, редактировать и удалять их.

5 - это второе число в правах доступа пользователя, ему соответствует страница Товары из таблицы прав доступа. Число 5 означает, что разрешен просмотр и удаление, следовательно пользователь user может просматривать и удалять товары, редактировать их ему нельзя.

4 - это третье число в правах доступа пользователя, ему соответствует страница Контактная информация из таблицы прав доступа. Число 4 означает, что разрешен только просмотр, следовательно пользователь user может только просматривать свои контакты, а редактировать их ему нельзя.

Но это все теория :). До сих пор не совсем понятно как внедрить такую систему в свой сайт. Что нужно сделать?

1. Добавить в отдельный файл, например dostup.php, следующую информацию:

Таблица прав доступа

Code

<?
$dostup[1] = "Новости";
$dostup[2] = "Товары";
$dostup[3] = "Контактная информация";
?>

Права доступа неавторизованного пользователя (гостя)
Если укажите "444", это значит что разрешен только просмотр, 000 - ничего нельзя, 777 - все можно. Возможны любые варианты. Здесь указываю три цифры, так как выше в таблице прав доступа три значения. Если бы было 34 страницы, столько бы было и цифр в правах гостя.

Code

<?
$dostup_quest = "444";
?>

Функция проверки прав доступа

Code

<?
function user_dostup($num)
{  
  global $user_dostup; // Содержит права доступа пользоателя  

  // Права по умолчанию  
  $priv["read"]=0;
  $priv["write"]=0;
  $priv["del"]=0;
   
  $priv_read = array(4,5,6,7); // Значения которые разрешают просмотр
  $priv_write = array(2,3,6,7); // Значения которые разрешают редактирование
  $priv_del = array(1,3,5,7); // Значения которые разрешают удаление

  $priv_lengh = strlen($user_dostup); // Определяется длина переменной с правами пользователя.
   
  $priv_num = ($num>$priv_lengh or $num==0) ? 0 : substr($priv_lengh, $num-1, 1); // Определяется значение прав доступа к этой странице. Если в переменной $user_dostup меньше цифр, чем в $num (передается функции), возвращается ноль.
   
  // Проверяем права на просмотр, редактирование, удаление и если результат положительный, записываем в массив  
  if(in_array($priv_num, $priv_read))$priv["read"]=1;  
  if(in_array($priv_num, $priv_write))$priv["write"]=1;  
  if(in_array($priv_num, $priv_del))$priv["del"]=1;
   
  return $priv; // Возвращаем массив с правами доступа  
}
?>

[size=16]2. На странице проверить права доступа к ней

Подключить dostup.php

Code

<?
require "dostup.php";
?>  

Записать в переменную права пользователя

При проверке авторизации считать в переменную права пользователя. Если пользователь неавторизован, то присвоить гостевые права:

Code

<?
if($auth['status']==1) $user_dostup = $auth['dostup'];
else $user_dostup = $dostup_quest;
?>

Предполагается что до этого была проверка авторизации и в массив записаны статус авторизации ($auth['status']) и права доступа пользователя ($auth['dostup']), которые хранятся в базе данных

Проверить права доступа у пользователя к данной странице

Итак, пользователь user (помните, у него права 754) посетил страницу tovars.php.

Чтоб узнать его права, вызовем функцию user_priv() и запишем результат ее выполнения в переменную:

Code

<?
$this_dostup = user_priv(2); // В аргументах передается номер этой страницы из таблицы прав доступа

Теперь проверяем, можно ли ему просматривать страницу:

Code

if(!$this_dostup['read']){echo "Нет прав для просмотра!"; exit;} // Выходит из скрипта, если нет прав

Теперь проверяем, можно ли ему редактировать товары:

Code

if(!$this_dostup['write']){$er = "Нет прав для редактирования!";} // Записывает сообщение об ошибке в переменную, если нет прав
else
{
  Здесь код редактирования
}

Теперь проверяем, можно ли ему удалять товары:

if(!$this_dostup['del']){$er = "Нет прав для удаления!";} // Записывает сообщение об ошибке в переменную, если нет прав
else
{
Здесь код удаления
}
?>
[/code]

Ну вот собственно и все :), можно подвести итоги. В таблицу прав доступа вносите все страницы, на которых эти права нужно ограничивать. Пользователям в базе данных указываете их права в виде ряда чисел (например, "7524452444746653214004000457"). На закрытых страницах проверяете права доступа к ним. Если у пользователя прав нет, выскочит ошибка.

В данной статье была описана система разделения прав доступа отдельно от системы авторизации. На практике для уровня безопасности они должны быть плотно связаны, помните об этом.

Крисько Александр
http://compadmin.ru

 
Автор: Крисько Александр
 
Оригинал статьи: http://www.woweb.ru/publ/59-1-0-862
 
Рейтинг@Mail.ru
© Студия WEB-дизайна PM-Studio, 2005. Все права защищены.