Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Распределение прав администрирования
 
 автор: carrot   (24.04.2006 в 01:52)   письмо автору
 
 

Всем доброй ночи. Возможно, данная тема уже обсуждалась на вашем форуме, но поиск не дал не ничего существенного :( Вобщем дело такое- серьезно раньше на пхп не писал, так, по-мелочи, но сейчас понадобилось написать движок. Впринципе, он практически готов, осталось только самое сложное и мне непонятное- распределение прав администраторов. Полагаю, надо сказать, что непривелигированных пользователей нет впринципе. Тоесть, просто посетители видят сам сайт, а админ-панель как-бы особняком- сессии с сайтом ее никак не связывают. Сделано это для большей безопасности и потому-что необходимости в авторизированном просмотре сайта нет. Теперь о проблеме. Суть такова- в админ-панели есть несколько разделов- новости, статьи, мета-теги, редактирование пользователей и так далее. Нужно вот что- в разделе редактирования пользователей указывать каждому юзеру права на доступ в тот или иной раздел администрирования, скажем, чекбоксами. Например так- есть пользователи и он должен править новости и статьи. Остальные элементы касаться его не должны. Другому надо дать прав побольше- кроме новостей и статей, пусть еще смотрит логи что-там посетители заказали(на сайте предпологается заказ услуг посредством формы заказа и мускул-базы). Каждый элемент администрирования хранится в отдельном файле- news.php, articles.php, menu.php и тд. Я предпологаю, что выглядеть оно должно следующим образом- в таблицу пользователей добавляется поле rigths, в которое, взависимости от желаний верховного администратора из формы редактирования пользователей отправляются записи, например вида "menu", "news", "articles" и тд. И все это там лежит. В файлах, описаных чуть выше, вставляется проверка на присутствие в поле rigths этого раздела и если оно там есть- пользователь в раздел допускается, в противном случае идет в лес.
Пробелму вроде как описал. Может кто-нпибудь помочь? Люди тут неглупые, читаю вас уже давно, авось поможет кто? Если не кодом, то хоть теорией :) Но кодом было-бы просто превосходно, ибо сайт уже надо заканчивать, а это моя первая полномасштабная работа и сам я точно не въеду :( Заранее благодарен.

   
 
 автор: Lelik   (24.04.2006 в 02:24)   письмо автору
 
   для: carrot   (24.04.2006 в 01:52)
 

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

CREATE TABLE users(
id_user ...
name ...
news ENUM('1', '0') DEFAULT '0' NOT NULL,
#Например если значение =1 доступ разрешен,а если = 0, то доступ запрещен
...
);

При помощи сессии можно организовать так:

<?php
...
session_start();
//Например на страницу с новостями
$query "SELECT * FROM users WHERE news=1";
$result mysql_query($result);
if(
$result$user = @mysql_fetch_array($result);
if (
$_SESSION['name']==$user['name'])
  {
    
//код для тех кому доступ разрешен
  
}
else
  {
   echo 
'<p>Вам доступ запрещен</p>';
  }
...
?>

А для создания "верховного администратора" можно добавить в таблицу users такое поле
status ENUM('glav_admin', 'admin', 'user') NOT NULL DEFAULT 'user'

А потом из скрипта где отображаются все юзеры, с возможностью редактирования их полномочий, выдавать по желанию привилегии, а страницу с доступом только для верховного админа защитить таким же методом как описывалось и ранее, только изменить SQL запрос на такой:

<?php
...
$query "SELECT * FROM users WHERE status ='glav_admin'";
...
?>

а доступ к другим страницам с помощью такого запроса:

<?php
...
//Например на страницу с новостями
$query "SELECT * FROM users WHERE status ='admin' OR status='glav_admin' AND news='1' ";
...
?>

   
 
 автор: carrot   (24.04.2006 в 02:27)   письмо автору
 
   для: Lelik   (24.04.2006 в 02:24)
 

тут неочень удобно то, что придется каждому пользователю ставить поле, если в админке появится новый раздел :( Но вцелом спасибо, счас обдумаю :)

   
 
 автор: Lelik   (24.04.2006 в 02:40)   письмо автору
 
   для: carrot   (24.04.2006 в 02:27)
 

для нового раздела в администрировании можно предесмотреть страничку, где всё это можно добавлять с помощью простого веб-интерфейса.
Создать форму где будет поле для нового раздела, а потом скрипт обработчик может содержать следующий SQL запрос.:
<?php
...
$_POST['new_modul'] = htmlspecialchars($_POST['new_modul']);
$query "ALTER TABLE users ADD ".$_POST['new_modul']." EMUN('1' , '0') DEFAULT '0'  NOT NULL AFTER (здесь следует указать имя поля после которого будет следовать данный столбец, иначе он будет добавлен в конец таблицы)";

...
?>

PS. Это мой личный подход к делу. Можно сделать что-то подобное, все зависит от вас и вашей фантазии, в общем как вам заблагорассудится

   
 
 автор: carrot   (24.04.2006 в 13:04)   письмо автору
 
   для: Lelik   (24.04.2006 в 02:40)
 

Идея хорошая, но, как я уже говорил- ненмого неудобно делать кучу всяких запросов, если есть возможность обойтись без них.
Вот как я думаю:
делаем табличку parts, в которой будут храниться идентификаторы разделов администрирования. В админ-панели будет элемент, который добавляет раздел в базу. Тоесть, регистрирует модуль(типа как в кмс широкораспространенных). Кстати, тут-же можно и выбрать пользователей, имеющих доступ. тут все ок.
Дальше в ход идет админка пользователей. В ней из таблички parts в чек-боксы быводятся разделы администрирования, администратор отмечает те, в которые пользователю можно и они заносятся в поле rigths таблицы users. Просто словами. Например, есть пользователь content_manager и все, что он должен делать- править новости и статьи. У него в поле rigths будет стоять такое значение 'news, articles'. Если надо что-бы он еще смотрел логи, тогда 'news, articles, logs'. В скриптах делается проверка- это самый гиморой для меня. Надо выбрать из базы значение поле rigths, найти там слово, соответствующее разделу и в случае удачи- пустить пользователя, иначе выдавать сообщение о нехватке прав. Вцелом вот так. Соображения?

   
 
 автор: ck   (24.04.2006 в 15:15)   письмо автору
 
   для: carrot   (24.04.2006 в 13:04)
 

Там нетрудно все в этой проверке. Т.е., например, если у вас в БД, в поле rights, хранится строка вида
articles, news, somepart, anotherpart , а вам нужно проверить, есть ли там news, то все примерно так:


<?php
$NeedleRight 
'news';
$AdminID 2// например, 2
$Result mysql_fetch_array(mysql_query("select rights from ANY_TABLE_NAME where id = $AdminID"));
$Rights explode(', '$Result['rights']);
if(
in_array($NeedleRight$Rights)) { 
    echo 
"давайте, редактируйте";
} else {
    echo 
"ага, вы вот куда пробрались";
}
?>

Чтобы избежать проблем с наличием-отсутствием пробелов, лучше хранить строку без них или прогонять элементы массива $Rights через функцию trim() в цикле. А чище всего - использовать serialize()

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования