|
|
|
| Всем доброй ночи. Возможно, данная тема уже обсуждалась на вашем форуме, но поиск не дал не ничего существенного :( Вобщем дело такое- серьезно раньше на пхп не писал, так, по-мелочи, но сейчас понадобилось написать движок. Впринципе, он практически готов, осталось только самое сложное и мне непонятное- распределение прав администраторов. Полагаю, надо сказать, что непривелигированных пользователей нет впринципе. Тоесть, просто посетители видят сам сайт, а админ-панель как-бы особняком- сессии с сайтом ее никак не связывают. Сделано это для большей безопасности и потому-что необходимости в авторизированном просмотре сайта нет. Теперь о проблеме. Суть такова- в админ-панели есть несколько разделов- новости, статьи, мета-теги, редактирование пользователей и так далее. Нужно вот что- в разделе редактирования пользователей указывать каждому юзеру права на доступ в тот или иной раздел администрирования, скажем, чекбоксами. Например так- есть пользователи и он должен править новости и статьи. Остальные элементы касаться его не должны. Другому надо дать прав побольше- кроме новостей и статей, пусть еще смотрит логи что-там посетители заказали(на сайте предпологается заказ услуг посредством формы заказа и мускул-базы). Каждый элемент администрирования хранится в отдельном файле- news.php, articles.php, menu.php и тд. Я предпологаю, что выглядеть оно должно следующим образом- в таблицу пользователей добавляется поле rigths, в которое, взависимости от желаний верховного администратора из формы редактирования пользователей отправляются записи, например вида "menu", "news", "articles" и тд. И все это там лежит. В файлах, описаных чуть выше, вставляется проверка на присутствие в поле rigths этого раздела и если оно там есть- пользователь в раздел допускается, в противном случае идет в лес.
Пробелму вроде как описал. Может кто-нпибудь помочь? Люди тут неглупые, читаю вас уже давно, авось поможет кто? Если не кодом, то хоть теорией :) Но кодом было-бы просто превосходно, ибо сайт уже надо заканчивать, а это моя первая полномасштабная работа и сам я точно не въеду :( Заранее благодарен. | |
|
|
|
|
|
|
|
для: 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' ";
...
?>
|
| |
|
|
|
|
|
|
|
для: Lelik
(24.04.2006 в 02:24)
| | тут неочень удобно то, что придется каждому пользователю ставить поле, если в админке появится новый раздел :( Но вцелом спасибо, счас обдумаю :) | |
|
|
|
|
|
|
|
для: 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. Это мой личный подход к делу. Можно сделать что-то подобное, все зависит от вас и вашей фантазии, в общем как вам заблагорассудится | |
|
|
|
|
|
|
|
для: Lelik
(24.04.2006 в 02:40)
| | Идея хорошая, но, как я уже говорил- ненмого неудобно делать кучу всяких запросов, если есть возможность обойтись без них.
Вот как я думаю:
делаем табличку parts, в которой будут храниться идентификаторы разделов администрирования. В админ-панели будет элемент, который добавляет раздел в базу. Тоесть, регистрирует модуль(типа как в кмс широкораспространенных). Кстати, тут-же можно и выбрать пользователей, имеющих доступ. тут все ок.
Дальше в ход идет админка пользователей. В ней из таблички parts в чек-боксы быводятся разделы администрирования, администратор отмечает те, в которые пользователю можно и они заносятся в поле rigths таблицы users. Просто словами. Например, есть пользователь content_manager и все, что он должен делать- править новости и статьи. У него в поле rigths будет стоять такое значение 'news, articles'. Если надо что-бы он еще смотрел логи, тогда 'news, articles, logs'. В скриптах делается проверка- это самый гиморой для меня. Надо выбрать из базы значение поле rigths, найти там слово, соответствующее разделу и в случае удачи- пустить пользователя, иначе выдавать сообщение о нехватке прав. Вцелом вот так. Соображения? | |
|
|
|
|
|
|
|
для: 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()
|
| |
|
|
|
|