WebScript.Ru
C:\   главная  ::   о сайте  ::  каталог скриптов  ::  гнездо  ::  форум  ::   авторам  :: Новостройки ::   ХОСТИНГ  ::

|| разделы::
|| поиск по сайту::

|| реклама::
|| новости почтой::
Рассылки Subscribe.Ru ::



Новости сайта WebScript.Ru
Популярные статьи

Hot 5 Stories

|| рекомендуем::




Управление правами пользователей на PHP


Прислал: Александр Крисько [ 21.01.2008 @ 12:38 ]
Раздел:: [ Статьи по PHP ]


Данная статья описывает способ управления правами доступа посетителей к страницам и функциям сайта. Назначая права доступа, мы можем гибко регулировать возможности посетителей. Посмотреть реальный пример использования такой системы можно в демо-версии профессионального каталога фирм CompAdmin на сайте >. Вариантов разделения прав доступа много, можете использовать какой больше нравится. Это лишь пример.

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

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

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

Информация, какое число из ряда соответствует какой странице, запишем в таблицу прав доступа. Допустим, у нас есть панель управления, состоящая из 3-х страниц: news.php, tovars.php и contacts.php. Создадим таблицу прав доступа:
<?
$dostup[1] = "Новости";
$dostup[2] = "Товары";
$dostup[3] = "Контактная информация";
?>
Предположим, имеем пользователя user с привилегиями 754. Разберем его привилегии:

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

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

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

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

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

Таблица прав доступа
<?
$dostup[1] = "Новости";
$dostup[2] = "Товары";
$dostup[3] = "Контактная информация";
?>
Права доступа неавторизованного пользователя (гостя)
Если укажите "444", это значит что разрешен только просмотр, 000 - ничего нельзя, 777 - все можно. Возможны любые варианты. Здесь указываю три цифры, так как выше в таблице прав доступа три значения. Если бы было 34 страницы, столько бы было и цифр в правах гостя.
<?
$dostup_quest = "444";
?>
Функция проверки прав доступа
<?
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; // Возвращаем массив с правами доступа
}
?>

2. На странице проверить права доступа к ней

Подключить dostup.php
<?
require "dostup.php";
?>
Записать в переменную права пользователя

При проверке авторизации считать в переменную права пользователя. Если пользователь неавторизован, то присвоить гостевые права:
<?
if($auth['status']==1) $user_dostup = $auth['dostup'];
else $user_dostup = $dostup_quest;
?>
Предполагается что до этого была проверка авторизации и в массив записаны статус авторизации ($auth['status']) и права доступа пользователя ($auth['dostup']), которые хранятся в базе данных

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

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

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

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

if(!$this_dostup['read']){echo "Нет прав для просмотра!"; exit;} 
// Выходит из скрипта, если нет прав Теперь проверяем, можно ли ему редактировать товары: if(!$this_dostup['write']){$er = "Нет прав для редактирования!";}
// Записывает сообщение об ошибке в переменную, если нет прав else { Здесь код редактирования } Теперь проверяем, можно ли ему удалять товары: if(!$this_dostup['del']){$er = "Нет прав для удаления!";}
// Записывает сообщение об ошибке в переменную, если нет прав else
{ Здесь код удаления } ?>
Ну вот собственно и все :), можно подвести итоги. В таблицу прав доступа вносите все страницы, на которых эти права нужно ограничивать. Пользователям в базе данных указываете их права в виде ряда чисел (например, "7524452444746653214004000457"). На закрытых страницах проверяете права доступа к ним. Если у пользователя прав нет, выскочит ошибка.

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

Крисько Александр



 :::::   пишет 30.01.2008 @ 13:50 
лохе. битовые операции учите.
 :::::  Игорь пишет 08.05.2009 @ 18:54 
// Александр Крисько:
// Здесь указываю три цифры, так как выше в таблице прав доступа три значения. Если бы было 34 страницы,
// столько бы было и цифр в правах гостя.
А если будет 10000 страниц?
Бред, если честно ))

 :::::  suicide пишет 15.07.2009 @ 14:01 
На теории можно было и ограничится. Интересная методика, надо будет применить в несколько ином формате, чтобы не было 34 цифры:)
 :::::  Александр пишет 16.07.2009 @ 20:47 
Если говорить об универсальности разделения прав доступа, то этот принцип не подходит, тем более, что часто требуется гораздо больший набор привилегий.. А если нужно определить права доступа к определенным блокам, а не страницам, то, на мой взгляд, вполне удобно.
 :::::  Константин пишет 17.06.2013 @ 12:05 
Хорошая статья, описывается все до подробностей, часто приходилось встречаться с такими понятиями как управления правами при загрузке на хостинг скриптов или папок и файлов на которые устанавливаем часто 777, но значение этих чисел не очень понимали, зато теперь все ясно от а до я.
Имя:
Email:
URL

Введите сумму двух чисел девять и одинн (девять+одинн=?)
Запомнить мою информацию

* Html запрещен* Ваш E-mail опубликован не будет.

Copyright © 2000-2001 WebScript.Ru nas@webscript.ru
Design © 2001 by Parallax Design Studio (aka Spectator.ru)
Все торговые марки и авторские права на эту страницу принадлежат их соответствующим владельцам.
Сгенерировано за: 0.0488820