|
|
|
| Подскажите, как каждому пользователю при регистрации задать свои права.
Например, пользователь 1 видит страницу и может прочитать сожержимое, пользователь 2 видит ту же страницу, но ему доступны некоторые файлы на скачивание, пользователь 3 видит туже страницу и может добавлять файлы и т.д. | |
|
|
|
|
|
|
|
для: Herurg
(19.08.2005 в 13:50)
| | А как организовано хранение информации на странице? Берётся ли она из базы данных или строится в виде include-ов? Информация о пользователях также хранится в базе данных или в файлах?
В любом случае понадобится вводить идентификаторы для пользователя id_user и для блоков информации, к которым они имеют доступ id_block и вводить таблицу соответствия id_user и id_block. При авторизации пользователя id_user, следует просматривать таблицу соответствия и выдавать ему только те блоки, на просмотр и работу с которыми он имеет право. Если действий много, просмотр, загрузка, добавление - то можно предусмотреть несколько таблиц. Реализовывать данную систему можно как на файлах, так и при помощи базы данных. Но в последнем случае код будет надёжнее, компактнее и более простым в написании и сопровождении. | |
|
|
|
|
|
|
|
для: cheops
(19.08.2005 в 13:59)
| | Планируется, что информация о пользователях будет хранитья в базе. А страница представляет из себя таблицу, в которой будут храниться ссылки на файлы, дата их создания, краткое описание исправлений. Тут и возникает задача, распределенного доступа. Нужно еще предусмотреть механизм добавления файлов (для пользователей с полными правами, своего рода "админк") . Задача мне очень ясна, но пока не очень ясна реализация. Может есть у кого опыт создания подобной базы. | |
|
|
|
|
|
|
|
для: Herurg
(19.08.2005 в 14:16)
| | можно еще пользователям присваивать, например, число от 1 до 3...
а потом
<?if ($rang==1) echo "...."; //если 1, то админ и выводим все что надо
else if ($rang==2) echo "...."; // если 2, то модер и выводим что для него надо
else echo "";?> //кто-то другой выводим минимум
|
| |
|
|
|
|
|
|
|
для: 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 "Привет админ!!!";
?>
|
Пользователя запоминать в сессии надо. | |
|
|
|
|
|
|
|
для: Axxil
(19.08.2005 в 15:44)
| | Я пока только начинаю осваивать PHP, знания начальные, а задача сразу серьёздная нарисовалась. Без учебника и Вашей помощи не обойтись. | |
|
|
|
|
|
|
|
для: Herurg
(19.08.2005 в 16:48)
| | Спрашивайте. Вместе мы сила ! :) | |
|
|
|
|
|
|
|
для: 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($nme, 0);
// Сравниваем пароль из базы данных и введённый посетителем
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("Здравствуйте зарегистрированный пользователь");
?>
|
Что нужно сделать, чтобы для каждого пользователя открывалась своя страница? Или одна и таже страница, но с разными данными? Если можно подскажите на примере данного кода. | |
|
|
|
|
|
|
|
для: 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 ставится в соответствие личная
//страница
?>
|
Только это не лучший выход. Вы же не будете каждому пользователю добавлять свою страницу . Лучше данные формировать для всех одинаковые, только разбавлять это единообразие персональными данными чувака взятыми из базы. | |
|
|
|
|
|
|
|
для: Axxil
(20.08.2005 в 10:48)
| | А функцию определения ID юзера куда вставлять? Нужно ли что-то в базе менять? | |
|
|
|
|
|
|
|
для: Herurg
(20.08.2005 в 11:12)
| | Зачем что-то менять в базе?
У вас же итак есть в таблице users поле id_user
А функция определения ID юзера может положить начало библиотеки для работы с юзерами.
Т.е вы создаёте у себя какталог, скажем includes куда будете складывать все подключаемые модули. Создаёте в ней файл, например users.php это будет библиотека функций для работы с пользователями. Переносим функцию getIdByName в этот файл.
Библиотеки подключается обычно в шапке сайта. Но в вашем случае можно подключитьт в обработчик. В самом верху, после функций подключения и выбора БД, добавить строчку include('includes/users.php') при у словии что handler.php находится в корне сайта. | |
|
|
|
|
|
|
|
для: 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);
}
?>
|
| |
|
|
|
|
|
|
|
для: Herurg
(20.08.2005 в 12:00)
| | Что значит разное содержание? Откуда данные будут браться из файла или из БД? Будет ли меняться оформление или только контент...
Приведите пример содержания страницы. Можно её прикрепить к сообщению. | |
|
|
|
|
|
|
|
для: Axxil
(20.08.2005 в 12:28)
| | Будет меняться только контент. Оформление не изменно. На страничке будет содержаться таблица со ссылками на архивы. Архивы будут лежать в папке, например: files. Ссылки на эти файлы из базы. | |
|
|
|
|
|
|
|
для: Herurg
(20.08.2005 в 12:43)
| | Вы имеете ввиду что у каждого юзера есть свои архивы?
Что значит ссылки из базы как это? Приведите плиз таблицу с этими ссылками.
Может есть смысл архивы размещать в каталоге files в подкаталоге соответствующем ID юзера? Например архив юзера 123 будет лежать по адресу /files/123/arch1.tar.gz. Тогда и ссылки не понадобится тянуть из базы. | |
|
|
|
|
|
|
|
для: Axxil
(20.08.2005 в 12:50)
| | Вот и дело то в том, что архивы одни и те же. Только пользователь с полными правами видит все архивы програм Release и PreRelease (тестовые программы). Может добавлять архивы, удалять (нужна я так понимаю форма для администрирования), так же может смотреть список "багов". Если заходит пользователь с правами тестирования, ему доступен тот же список Release и PreRelease, но только для скачивания, добавлять он ни чего не может. Если заходит обычный пользователь, ему доступен только список программ - Release, для скачивания, добавлять ни чего нельзя. | |
|
|
|
|
|
|
|
для: 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-формой загрузки файлов. | |
|
|
|
|
|
|
|
для: 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 столбца, нужно каждому пользователю разрешить доступ к разным столбцам. Админ - полный доступ,
тестер - нет возможности добавлять файлы, пользователь - только закачка программы. | |
|
|
|
|
|
|
|
для: 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>
|
И под загрузкой что имеется ввиду на сервер или с сервера? | |
|
|
|
|
|
|
|
для: cheops
(20.08.2005 в 14:56)
| | Пользователь с правами администратора может загружать файлы на сервер, остальные только скачивать. | |
|
|
|
|
|
|
|
для: Herurg
(20.08.2005 в 15:29)
| | В форум смогу выйти только в Пн., благо будет над чем поразмыслить в выходные :-). | |
|
|
|