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

Форум PHP

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

 

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

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

тема: Каждому пользователю свои права
 
 автор: Herurg   (19.08.2005 в 13:50)   письмо автору
 
 

Подскажите, как каждому пользователю при регистрации задать свои права.
Например, пользователь 1 видит страницу и может прочитать сожержимое, пользователь 2 видит ту же страницу, но ему доступны некоторые файлы на скачивание, пользователь 3 видит туже страницу и может добавлять файлы и т.д.

   
 
 автор: cheops   (19.08.2005 в 13:59)   письмо автору
 
   для: Herurg   (19.08.2005 в 13:50)
 

А как организовано хранение информации на странице? Берётся ли она из базы данных или строится в виде include-ов? Информация о пользователях также хранится в базе данных или в файлах?

В любом случае понадобится вводить идентификаторы для пользователя id_user и для блоков информации, к которым они имеют доступ id_block и вводить таблицу соответствия id_user и id_block. При авторизации пользователя id_user, следует просматривать таблицу соответствия и выдавать ему только те блоки, на просмотр и работу с которыми он имеет право. Если действий много, просмотр, загрузка, добавление - то можно предусмотреть несколько таблиц. Реализовывать данную систему можно как на файлах, так и при помощи базы данных. Но в последнем случае код будет надёжнее, компактнее и более простым в написании и сопровождении.

   
 
 автор: Herurg   (19.08.2005 в 14:16)   письмо автору
 
   для: cheops   (19.08.2005 в 13:59)
 

Планируется, что информация о пользователях будет хранитья в базе. А страница представляет из себя таблицу, в которой будут храниться ссылки на файлы, дата их создания, краткое описание исправлений. Тут и возникает задача, распределенного доступа. Нужно еще предусмотреть механизм добавления файлов (для пользователей с полными правами, своего рода "админк") . Задача мне очень ясна, но пока не очень ясна реализация. Может есть у кого опыт создания подобной базы.

   
 
 автор: P@Sol   (19.08.2005 в 14:21)   письмо автору
 
   для: Herurg   (19.08.2005 в 14:16)
 

можно еще пользователям присваивать, например, число от 1 до 3...
а потом

<?if ($rang==1) echo "...."//если 1, то админ и выводим все что надо
else if ($rang==2) echo "...."// если 2, то модер и выводим что для него надо
else echo "";?> //кто-то другой выводим минимум

   
 
 автор: Axxil   (19.08.2005 в 15:44)   письмо автору
 
   для: Herurg   (19.08.2005 в 14:16)
 

Ну тут с правами всё просто в базе в таблице users (или как она у вас там называется) создаётся поле root. В него пишутся циферки которые и будут обозначать уровень доступа.

потом пишется функция

function getRoot($userId){
 $query=mysql_query('select root from users where user_id='.$userId);
 return mysql_result($query,0,0);
}
Вот и теперь на любой странице

<?
include('lib.php');
//.....
if(getRoot($userId) == 1)
  echo 
"Привет админ!!!"
?>


Пользователя запоминать в сессии надо.

   
 
 автор: Herurg   (19.08.2005 в 16:48)   письмо автору
 
   для: Axxil   (19.08.2005 в 15:44)
 

Я пока только начинаю осваивать PHP, знания начальные, а задача сразу серьёздная нарисовалась. Без учебника и Вашей помощи не обойтись.

   
 
 автор: Axxil   (19.08.2005 в 17:15)   письмо автору
 
   для: Herurg   (19.08.2005 в 16:48)
 

Спрашивайте. Вместе мы сила ! :)

   
 
 автор: Herurg   (20.08.2005 в 09:49)   письмо автору
 
   для: Axxil   (19.08.2005 в 17:15)
 

Сделал авторизацию, как было описано ранее: http://softtime.ru/forum/read.php?id_forum=1&id_theme=80&page=1
База данных test, запрос:

CREATE TABLE users ( 
  id_user INT NOT NULL auto_increment, 
  name TINYTEXT, 
  password TINYTEXT, 
  PRIMARY KEY  (id_user) 
) TYPE=MyISAM;

Далее информация о пользователях:

INSERT INTO users VALUES(NULL,'user1','pass1'); 
INSERT INTO users VALUES(NULL,'user2','pass2'); 
INSERT INTO users VALUES(NULL,'user3','pass3');

Файл формы авторизации (index.php):

<?php
  
// Это файл index.php
  
session_start();
?>
<form action=handler.php method=post>
Имя посетителя : <input type=text name=name value=<?php echo $_SESSION['user']; ?>><br>
Пароль : <input type=password name=password value=<?php echo $_SESSION['password']; ?>><br>
<input type=submit value=Отправить>
</form>
<?php
  
// Если посетитель "вошёл" - приветствуем его
  
if(isset($_SESSION['user'])) echo "Здравствуйте, ".$_SESSION['user']."!";
?>

Файл обработчик (handler.php)

<?php
    
// Это файл handler.php
    // Имя сервера базы данных, например $dblocation = "mysql28.noweb.ru"
    // сейчас выставлен сервер локальной машины
    
$dblocation "localhost";
    
// Имя базы данных
    
$dbname "test";
    
// Имя пользователя... Скорее всего будет совпадать с вашим доменным именем
    // у нас, например $dbuser = "softtime";
    
$dbuser "root";
    
// Пароль - в комментариях не нуждается ;-)
    
$dbpasswd "";
    
// Соединяемся с сервером базы данных
    
$dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd);
    if (!
$dbcnx) {
      echo( 
"<P>В настоящий момент сервер базы данных не
                          доступен, поэтому корректное отображение
                          страницы невозможно.</P>" 
);
      exit();
    }
    
// Выбираем базу данных
    
if (! @mysql_select_db($dbname,$dbcnx) ) {
      echo( 
"<P>В настоящий момент база данных не доступна,
                          поэтому корректное отображение страницы
                          невозможно.</P>" 
);
      exit();
    }
    
// Формируем и выполняем SQL-запрос для посетителя с
    // именем $_POST['name']
    
$query "SELECT password FROM users WHERE name='".$_POST['name']."'";
    
$nme mysql_query($query);
    if(!
$nme)
    {
      echo 
mysql_error();
      echo 
"Ошибка выполнения запроса";
      exit();
    }
    
// Если запрос вернул результат - производим дальнейшую обработку
    
if(mysql_num_rows($nme) > 0)
    {
       
// Получаем пароль
       
$password mysql_result($nme0);
       
// Сравниваем пароль из базы данных и введённый посетителем
       
if ($_POST['password'] == $password)
       {
         
// Идентификация прошла успешно - осуществляем
         // "вход" посетителя. Для того, чтобы в течении текущей
         // сесси посетитель не вводил своё имя пароль повторно -
         // передаём их через сессию
         
if(session_start())
         {
           
$_SESSION['user'] = $_POST['name'];
           
$_SESSION['password'] = $_POST['password'];
           
// Осуществляем автоматический переход на
           // страницу index.php чтобы убедится, что
           // посетитель "вошёл"
           
echo "<HTML><HEAD>
                 <META HTTP-EQUIV='Refresh' CONTENT='0; URL=tabl.php'>
                 </HEAD><body>"
;
         }
       }
       else
       {
         echo 
"Ошибка идентификации: неправильный пароль";
         exit();
       }
    }
    
// Если в результате запроса не получено ни одной
    // строки - посетитель с таким именем не зарегистрирован
    
else
    {
      echo 
"Ошибка идентификации: посетитель не зарегистрирован";
      exit();
    }
?>

После ввода логина и пароля для авторизованных пользователей открывается страница tabl.php

<?php

echo("Здравствуйте зарегистрированный пользователь");

?>

Что нужно сделать, чтобы для каждого пользователя открывалась своя страница? Или одна и таже страница, но с разными данными? Если можно подскажите на примере данного кода.

   
 
 автор: Axxil   (20.08.2005 в 10:48)   письмо автору
 
   для: Herurg   (20.08.2005 в 09:49)
 

Пишем функцию определения id юзера. Предполагаем что name уникальный.

<?
function getIdByName($name){
  
$sql='select id_user from users where name=\''.$name.'\'';
  
$query mysql_query($sql);
  return 
mysql_result($query,0,0);
}
?>


Далее можно сделать так:


<?php 
  
// Это файл index.php 
  
session_start(); 
?> 
<form action=handler.php method=post> 
Имя посетителя : <input type=text name=name value=<?php echo $_SESSION['user']; ?>><br> 
Пароль : <input type=password name=password value=<?php echo $_SESSION['password']; ?>><br> 
<input type=submit value=Отправить> 
</form> 
<?php 
  
// Если посетитель "вошёл" - приветствуем его 
  
if(isset($_SESSION['user'])){
    include(
'page_'.getIdByName($_SESSION['user']).'.php');
  }  
// То есть каждому юзеру, взависимости от ID ставится в соответствие личная 
//страница
?>

Только это не лучший выход. Вы же не будете каждому пользователю добавлять свою страницу . Лучше данные формировать для всех одинаковые, только разбавлять это единообразие персональными данными чувака взятыми из базы.

   
 
 автор: Herurg   (20.08.2005 в 11:12)   письмо автору
 
   для: Axxil   (20.08.2005 в 10:48)
 

А функцию определения ID юзера куда вставлять? Нужно ли что-то в базе менять?

   
 
 автор: Axxil   (20.08.2005 в 11:35)   письмо автору
 
   для: Herurg   (20.08.2005 в 11:12)
 

Зачем что-то менять в базе?
У вас же итак есть в таблице users поле id_user

А функция определения ID юзера может положить начало библиотеки для работы с юзерами.
Т.е вы создаёте у себя какталог, скажем includes куда будете складывать все подключаемые модули. Создаёте в ней файл, например users.php это будет библиотека функций для работы с пользователями. Переносим функцию getIdByName в этот файл.
Библиотеки подключается обычно в шапке сайта. Но в вашем случае можно подключитьт в обработчик. В самом верху, после функций подключения и выбора БД, добавить строчку include('includes/users.php') при у словии что handler.php находится в корне сайта.

   
 
 автор: Herurg   (20.08.2005 в 12:00)   письмо автору
 
   для: Axxil   (20.08.2005 в 11:35)
 

Подключил, для каждого пользователя загружается страница tabl.php с одним и тем же сожержанием, а нужно разное содержание, как это реализовать? (Прошу извинить за множество глупых вопросов, только начинаю осваивать PHP после HTML.)
Файл handler.php

<?php
    
// Это файл handler.php
    // Имя сервера базы данных, например $dblocation = "mysql28.noweb.ru"
    // сейчас выставлен сервер локальной машины
    
$dblocation "localhost";
    
// Имя базы данных
    
$dbname "test";
    
// Имя пользователя... Скорее всего будет совпадать с вашим доменным именем
    // у нас, например $dbuser = "softtime";
    
$dbuser "root";
    
// Пароль - в комментариях не нуждается ;-)
    
$dbpasswd "";
    
// Соединяемся с сервером базы данных
    
$dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd);
    include(
'includes/users.php');
    if (!
$dbcnx) {
      echo( 
"<P>В настоящий момент сервер базы данных не
                          доступен, поэтому корректное отображение
                          страницы невозможно.</P>" 
);
      exit();
.........................

includes/Users.php

<?
function getIdByName($name){
  
$sql='select id_user from users where name=\''.$name.'\'';
  
$query mysql_query($sql);
  return 
mysql_result($query,0,0);
}
?>

   
 
 автор: Axxil   (20.08.2005 в 12:28)   письмо автору
 
   для: Herurg   (20.08.2005 в 12:00)
 

Что значит разное содержание? Откуда данные будут браться из файла или из БД? Будет ли меняться оформление или только контент...
Приведите пример содержания страницы. Можно её прикрепить к сообщению.

   
 
 автор: Herurg   (20.08.2005 в 12:43)   письмо автору
 
   для: Axxil   (20.08.2005 в 12:28)
 

Будет меняться только контент. Оформление не изменно. На страничке будет содержаться таблица со ссылками на архивы. Архивы будут лежать в папке, например: files. Ссылки на эти файлы из базы.

   
 
 автор: Axxil   (20.08.2005 в 12:50)   письмо автору
 
   для: Herurg   (20.08.2005 в 12:43)
 

Вы имеете ввиду что у каждого юзера есть свои архивы?
Что значит ссылки из базы как это? Приведите плиз таблицу с этими ссылками.
Может есть смысл архивы размещать в каталоге files в подкаталоге соответствующем ID юзера? Например архив юзера 123 будет лежать по адресу /files/123/arch1.tar.gz. Тогда и ссылки не понадобится тянуть из базы.

   
 
 автор: Herurg   (20.08.2005 в 13:01)   письмо автору
 
   для: Axxil   (20.08.2005 в 12:50)
 

Вот и дело то в том, что архивы одни и те же. Только пользователь с полными правами видит все архивы програм Release и PreRelease (тестовые программы). Может добавлять архивы, удалять (нужна я так понимаю форма для администрирования), так же может смотреть список "багов". Если заходит пользователь с правами тестирования, ему доступен тот же список Release и PreRelease, но только для скачивания, добавлять он ни чего не может. Если заходит обычный пользователь, ему доступен только список программ - Release, для скачивания, добавлять ни чего нельзя.

   
 
 автор: cheops   (20.08.2005 в 13:11)   письмо автору
 
   для: Herurg   (20.08.2005 в 13:01)
 

Если архивы одни и теже и лежат на одном месте, их следует защищать средствами Apache, при этом имена пользователей и их пароли брать из базы данных и сравнивать с переменными $_SERVER['PHP_AUTH_USER'] и $_SERVER['PHP_AUTH_PW'], соответственно.
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=1347
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=730
Иначе ушлые пользователи будут качать файлы в обход страницы. Загрузку файлов на страницу предотвратить легко, не предоставляя доступ к странице с HTML-формой загрузки файлов.

   
 
 автор: Herurg   (20.08.2005 в 14:28)   письмо автору
 
   для: cheops   (20.08.2005 в 13:11)
 

Вот примерный код странички с таблицей (он на html - сори):

<html>
<body>
<p align="CENTER">База файлов.</p>
<table align="CENTER" border="1">
<tr><td colspan="3" align="CENTER">Система 1</td>
</tr>
<tr><td>Сборка программы</td><td>Дата создания</td><td>Ошибки</td></tr>
<tr><td><a href="files/1.zip">1.0</a></td><td>10.08.2005</td><td>Ошибки</td></tr>
<tr><td><a href="files/2.zip">1.1</a></td><td>11.08.2005</td><td>Ошибки</td></tr>
<tr><td><a href="files/1.zip">1.2</a></td><td>12.08.2005</td><td>Ошибки</td></tr>
<tr><td><a href="files/1.zip">т.д.</a></td><td>т.д.</td><td>Ошибки</td></tr>
</table>
</body>
</html>

Задача даже может упращается. В таблице 3 столбца, нужно каждому пользователю разрешить доступ к разным столбцам. Админ - полный доступ,
тестер - нет возможности добавлять файлы, пользователь - только закачка программы.

   
 
 автор: cheops   (20.08.2005 в 14:56)   письмо автору
 
   для: Herurg   (20.08.2005 в 14:28)
 

Стобец убрать не сложно - для этого достаточно организовать условный вывод
<html> 
<body> 
<p align="CENTER">База файлов.</p> 
<table align="CENTER" border="1"> 
<tr><td colspan="3" align="CENTER">Система 1</td> 
</tr> 
<tr><td>Сборка программы</td><td>Дата создания</td><td>Ошибки</td></tr> 
<tr><td><a href="files/1.zip">1.0</a></td><td>10.08.2005</td><td>Ошибки</td></tr> 
<tr><td><a href="files/2.zip">1.1</a></td><td>11.08.2005</td><td>Ошибки</td></tr> 
<tr><td><a href="files/1.zip">1.2</a></td><td>12.08.2005</td><td>Ошибки</td></tr> 
<tr><td><a href="files/1.zip">т.д.</a></td><td>т.д.</td><td>Ошибки</td></tr> 
</table> 
<?php
  
if($_SESSION['status'] == 'admin' || $_SESSION['status'] == 'user')
  {
    
// HTML-форма для загрузки файла
  
}
?>
</body> 
</html>

И под загрузкой что имеется ввиду на сервер или с сервера?

   
 
 автор: Herurg   (20.08.2005 в 15:29)   письмо автору
 
   для: cheops   (20.08.2005 в 14:56)
 

Пользователь с правами администратора может загружать файлы на сервер, остальные только скачивать.

   
 
 автор: Herurg   (20.08.2005 в 15:44)   письмо автору
 
   для: Herurg   (20.08.2005 в 15:29)
 

В форум смогу выйти только в Пн., благо будет над чем поразмыслить в выходные :-).

   
Rambler's Top100
вверх

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