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

Форум PHP

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

 

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

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

тема: Система авторизации с различными уровнями доступа
 
 автор: Zew   (04.09.2005 в 22:19)   письмо автору
 
 

Здравствуйте еще раз. =)
Я к вам с новым вопросом (предидущую проблему пришлось отложить до лучших времен, т.к. для нее сначала хорошо бы сделать авторизацию).
Вобщем, я предполагала сделать на сайте возможность авторизации для юзеров с разными правами. Допустим, я, как админ, и мои соадмины, при заходе под своими логином и паролем, имели возможность прямо с сайта добавлять новости, выгружать статьи, файлы и т.п.; те, кому я поручала работу над какой-то определенной областью сайта имели меньшие права, и только в отведенной им области; зарегистрированные участники, которым я дала привилегии, могли бы скачивать какие-то бонусы, а просто зарегистрированные так же имели возможности, отличные от возможностей гостей. (ну, возможно это уже в перспективе, для начала просто админского и юзерского доступа хватило бы)).

Имеется база данных, в одной таблице которых есть поля: id (автоматически прибавляющееся на единицу), name, pass и rights (в котором проставлялись бы права одной буквой, скажем "a" для админа и т.п.)

Доступ планирую сделать на сессиях и куках, т.е. чтобы как на форумах допустим - при заходе и наличии куки сразу идентифицировался юзер, если куки нет - она бы ставилась, если юзер ввел верные лог и пароль, а если куки запрещены и вообще в пределах одного посещения сайта работали бы сессии.

Вобщем, полазив по вашему форуму (кстати, форум у вас действительно супер! Ни в одном учебнике столько не находила, сколько у вас)), я кое-как смогла настроить следующий код:


Ну конечно же форма авторизации:
<html><body>
<form action=handler.php method=post> 
Имя посетителя : <input type=text name=name><br> 
Пароль : <input type=password name=password><br> 
<input type=checkbox name=auth> 
входить автоматически<br>
<input type=submit value=Отправить> 
</form>
</html></body>


<?
session_start
();
$name_a $_POST['name'];
$pass_a $_POST['password'];
$auth_a $_POST['auth'];
$server="localhost";
$user="";
$password="";
$database="";
if(!
mysql_connect($server$user$password))
{echo 
"<p>Ошибка!</p>"; exit;}
mysql_select_db($database);
$query mysql_query("select pass, name, id, rights from users");
$fetch_auth mysql_fetch_array($query);
$pass $fetch_auth[pass];
$name $fetch_auth[name];
if (
$name_a == $name && $pass_a == $pass) {
echo 
"Приветствуем вас, $name";} 
else {echo 
"Неправильный пароль.";} 
?> 



Вопрос в следующем: как к этому прицепить куки и сессии? о_О
Сразу предупреждаю: я еще полный чайник и о пхп узнала только 10 дней назад, но стараюсь учиться максимально быстро, и была бы благодарна любой помощи в постижении этого таинственного и манящего мира программирования... ^_^

   
 
 автор: cheops   (05.09.2005 в 01:31)   письмо автору
 
   для: Zew   (04.09.2005 в 22:19)
 

Попадалась ли вам вот эта тема http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=80, если попадалась, то какие трудности возникают?

   
 
 автор: cheops   (05.09.2005 в 01:55)   письмо автору
 
   для: cheops   (05.09.2005 в 01:31)
 

Хм.. у вас уже даже session_start(); имеется, т.е. для того, чтобы зарегистрировать имя в сессии достаточно испрвить блок
<?php
if ($name_a == $name && $pass_a == $pass) { 
echo 
"Приветствуем вас, $name";} 
else {echo 
"Неправильный пароль.";}
?>

следующим образом
<?php
if ($name_a == $name && $pass_a == $pass)

  
$_SESSION['name'] = $name;
  echo 
"Приветствуем вас, $name";

else 
{
  echo 
"Неправильный пароль.";
}
?>

А затем на каждой странице просто проверять определена ли переменная $_SESSION['name']
<?php
  
if(isset($_SESSION['name']))
  {
    echo 
"Доступ";
  }
  else
  {
    echo 
"Пройдите авторизацию";
  }
?>

Так как сессия хранится на сервере, подделка их практически исключена, но идентификатор сессии может быть украден http://www.softtime.ru/info/articlephp.php?id_article=36

   
 
 автор: cheops   (05.09.2005 в 01:41)   письмо автору
 
   для: Zew   (04.09.2005 в 22:19)
 

>>Ни в одном учебнике столько не находила, сколько у вас
Всё в учебник сложно включить, так как над ним работает меньше человек чем над форумом и объём его ограничен - в настоящий момент OffLine-версия данного форума скомпилированная в chm-формат занимает 12 Мб.

   
 
 автор: Zew   (05.09.2005 в 13:58)   письмо автору
 
   для: cheops   (05.09.2005 в 01:41)
 

Спасибо большое всем, уже кое-что получилось. =) Но с куками что-то я не совсем поняла...
Во-первых, должно ли session_start располагаться вообще в самом верху страницы, или только в самом начале пхп-кода? Т.е. может ли выше находиться ХТМЛ?

И вот сейчас у меня такой код:


<?
session_start
();
$s $_GET[s];
$server="localhost";
$user="";
$password="";
$database="";
if(!
mysql_connect($server$user$password))
{echo 
"<p>Ошибка базы данных</p>"; exit;}
mysql_select_db($database);
$query mysql_query("select pass, name, id, rights from users");
$fetch_auth mysql_fetch_array($query);
$pass $fetch_auth[pass];
$name $fetch_auth[name];

if(isset(
$_COOKIE['cookie'])){
$name_c $cookie[name];
$pass_c $cookie[pass];
if (
$name_c == $name && $pass_c == $pass){
$_SESSION['name'] = $name;}
else{
echo 
"<br><form action='index.php?s=1' method=post> 
Имя посетителя : <input type=text name=name><br> 
Пароль : <input type=password name=password><br> 
<input type=submit value=Отправить> 
</form>"
;}
}

if (
$s == 1){
$name_a $_POST["name"];
$pass_a $_POST["password"];
if (
$name_a == $name && $pass_a == $pass){
$_SESSION["name"] = $name;
SetCookie("cookie","$name $pass",time()+604800);
echo 
"Приветствуем вас, $name";}
else {echo 
"Неверный пароль";}
}

?>


И он конечно же не работает в таком виде. )) *до этого пробывала так же на одинх сессиях без кукисов, и вроде как все работало без ошибок, но тот вариант кода я не догадалась сохранить и сразу начала переделывать*

Ошибка кажется вот в этой части:

if(isset($_COOKIE['cookie'])){
$name_c = $cookie[name];
$pass_c = $cookie[pass];
if ($name_c == $name && $pass_c == $pass){
$_SESSION['name'] = $name;}
else{
echo "<br><form action='index.php?s=1' method=post> 
Имя посетителя : <input type=text name=name><br> 
Пароль : <input type=password name=password><br> 
<input type=submit value=Отправить> 
</form>";}
}


А конкретно, я не совсем понимаю, как получить из куки значения переменных обратно? ))

   
 
 автор: cheops   (05.09.2005 в 19:09)   письмо автору
 
   для: Zew   (05.09.2005 в 13:58)
 

session_start() можно помещать в любом месте программы, но до вывода любой информации в окно браузера (включая пробелы и переводы строк). Не очень понятно почему используется сессия и куки одновременно - обычно прибегают только к одному из способов. Для того, чтобы получить значение из cookie следует просто обратится к соотвествующему элементу массива $_COOKIE - если cookie установлена - значение в массиве будет доступно на любой странице сайта.

   
 
 автор: Zew   (05.09.2005 в 19:31)   письмо автору
 
   для: cheops   (05.09.2005 в 19:09)
 

>Не очень понятно почему используется сессия и куки одновременно

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

   
 
 автор: cheops   (05.09.2005 в 19:51)   письмо автору
 
   для: Zew   (05.09.2005 в 19:31)
 

Если уникальный идентификатр сессии SID не передаётся методом GET, то он всё-равно передаётся через cookie - и сессия тоже может отказать.

   
 
 автор: Zew   (05.09.2005 в 23:38)   письмо автору
 
   для: cheops   (05.09.2005 в 19:51)
 

Хм, ну и как же лучше сделать тогда? Оставить только сессии, или приладить куки без сессий?..

   
 
 автор: cheops   (05.09.2005 в 23:52)   письмо автору
 
   для: Zew   (05.09.2005 в 23:38)
 

Лучше остановится на сессиях, так как некоторые пользователи разрешают сессионные куки, но запрещают постоянные.

   
 
 автор: Zew   (06.09.2005 в 11:52)   письмо автору
 
   для: cheops   (05.09.2005 в 23:52)
 

А как в таком случае сделать, чтобы не приходилось авторизовываться при каждом заходе на сайт?.. Вот допустим кое-где я видела рядом с авторизацией чекбокс "запомнить". Как он устроен?

   
 
 автор: cheops   (06.09.2005 в 13:21)   письмо автору
 
   для: Zew   (06.09.2005 в 11:52)
 

В этом случае, помимо логина в сессию также помещают пароль, затем логин и пароль подставляют в форму авторизации при помощи атрибута value
<br><form action='index.php?s=1' method=post> 
Имя посетителя : <input type=text name=name value='<?php echo $_SESSION['name']; ?>'><br> 
Пароль : <input type=password name=password value='<?php echo $_SESSION['password']; ?>'><br> 
<input type=submit value=Отправить> 
</form>

   
 
 автор: Zew   (07.09.2005 в 00:12)   письмо автору
 
   для: cheops   (06.09.2005 в 13:21)
 

хм, т.е. в этом случае пароль и логин просто будут печататься как значения по умолчанию? Но ведь это будет не автоматическая авторизация, если допустим человек зайдет на сайт через неделю? Как я поняла, тогда и эти переменные-то не получат значения, т.к. сессия будет уже сто раз как завершена, и там будет просто пусто, и человеку придется заново вводить свой лог и пароль (который мои форумцы то и дело забывают)... *_*

   
 
 автор: cheops   (07.09.2005 в 00:49)   письмо автору
 
   для: Zew   (07.09.2005 в 00:12)
 

Если важно запоминать логин и пароль на длительное время, следует прибегать к cookies. Как построен механизм авторизации? Мы же не знаем, что вы разрабатываете, например, на форуме этот механизм очень даже подходит и не вызывает неудобств у посетителя. Если необходимо получать доступ закрытой системе сайта - это другой вопрос - здесь следует редактировать не форму, а механизм авторизации.

   
 
 автор: Zew   (07.09.2005 в 08:48)   письмо автору
 
   для: cheops   (07.09.2005 в 00:49)
 

Ну, вообще-то это должен быть просто сайт, но т.к. на сайте у меня выложен довольно большой объем "народного творчества", то мне было бы очень удобно, если бы сами они могли выкладывать свои работы на сайте через вебинтерфейс, ну и естественно чтобы каждый имел доступ только к своей области сайта, которую я им позволю. Плюс я и мои соадмины могли бы публиковать новости скажем с той же главной страницы, но возможность такая появлялась бы только при авторизации под админским логом и паролем.
Вот для этого мне и нужна авторизация - из базы берется лог, пароль и права доступа, а собственно авторизация - только первый шаг разработки этого всего вышеперечисленного. В принципе, не так сложно ввести заново лог и пароль, но все же хотелось бы нормальные условия, а не авторизироваться каждый раз, когда нужно заглянуть на сайт...

   
 
 автор: cheops   (07.09.2005 в 13:17)   письмо автору
 
   для: Zew   (07.09.2005 в 08:48)
 

Тогда можно в cookie прописать пароль и логин, а от сессий вообще отказаться - $_COOKIE тоже является суперглобальным массивом и будет доступен на любой странице
<?php
if(isset($_COOKIE['cookie']))

  
$name_c $_COOKIE[name]; 
  
$pass_c $_COOKIE[pass]; 
  if (
$name_c != $name || $pass_c != $pass)
  { 
     echo 
"<br><form action='index.php?s=1' method=post> 
     Имя посетителя : <input type=text name=name><br> 
     Пароль : <input type=password name=password><br> 
    <input type=submit value=Отправить> 
    </form>"
;
  } 
}
?>

   
 
 автор: Zew   (07.09.2005 в 17:25)   письмо автору
 
   для: cheops   (07.09.2005 в 13:17)
 

Спасибочки. =) А как в куку запихнуть два значения? Т.е. нужно так:

SetCookie("login","$name",time()+604800);
SetCookie("password","$pass",time()+604800);


или так:

SetCookie("login","$name $pass",time()+604800);

?

Апдейт:
Вот сейчас для теста попробывала вот такой скрипт, чтобы вывести значение из куки:

<?
if ($name_a == $name && $pass_a == $pass){
SetCookie("login","$name $pass",time()+604800);
echo 
"Приветствуем вас, $name <br>";
$rfds $_COOKIE[name];
echo 
$rfds;
}
else {echo 
"Неверный пароль. } 
?>


Авторизуется нормально, выводится "приветствуем вас", но значение куки не выводится ни в каком виде, т.е. как я не пробывала - $_COOKIE[name], $_COOKIE[login], $_COOKIE["name"] - бесполезно. Видимо, эта кука просто не устанавливается.
Скажите, в чем может быть ошибка в этом коде?

<?
$server
="localhost";
$user="";
$password="";
$database="";
if(!
mysql_connect($server$user$password))
{echo 
"<p>Ошибка базы данных</p>"; exit;}
mysql_select_db($database);
$query mysql_query("select pass, name, id, rights from users");
$fetch_auth mysql_fetch_array($query);
$pass $fetch_auth[pass];
$name $fetch_auth[name];
$name_a $_POST["name"];
$pass_a $_POST["password"];

if (
$name_a == $name && $pass_a == $pass){
SetCookie("login","$name $pass",time()+604800);

// Аналогично: SetCookie("login","$name",time()+604800);
//                         SetCookie("password","$pass",time()+604800);

echo "Приветствуем вас, $name <br>";
}
else {echo 
"Неверный пароль.";}
?>

   
 
 автор: cheops   (07.09.2005 в 20:29)   письмо автору
 
   для: Zew   (07.09.2005 в 17:25)
 

Нужно так
SetCookie("login","$name",time()+604800); 
SetCookie("password","$pass",time()+604800);

   
 
 автор: Zew   (07.09.2005 в 22:53)   письмо автору
 
   для: cheops   (07.09.2005 в 20:29)
 

Эх, не работает... *_* в чем ошибка не пойму... =(

   
 
 автор: cheops   (08.09.2005 в 02:13)   письмо автору
 
   для: Zew   (07.09.2005 в 22:53)
 

А что-нибудь пишет? Какие-нибудь предупреждения?

   
 
 автор: Niemand   (08.09.2005 в 04:31)   письмо автору
 
   для: cheops   (07.09.2005 в 20:29)
 


<?
SetCookie
("login","$name",time()+604800); 
SetCookie("password","$pass",time()+604800); 
?>

так устанавливается кука, а выводится так

<?
echo $_COOKIE['login'];
echo 
$_COOKIE['password'];
?>

соответственно. (была у меня похожая проблемка как-то раз, с индифекаторами путоница)

   
 
 автор: Zew   (08.09.2005 в 12:05)   письмо автору
 
   для: Niemand   (08.09.2005 в 04:31)
 

Все равно почему-то не работает. Никаких ошибок не выдается, но и значения куки тоже не выводится. Т.е. она видимо просто не устанавливается.. *_*
Может кроме setcookie должно быть еще что-то, чтобы установить куку?..
А может просто у меня они не работают... попробуйте кто-нибудь авторизоваться здесь: http://ect.hellsinguniverse.ru/index3.php
лог - test
пароль - test
Сразу после авторизации, там, где три единицы пропечатываются, должно появиться то, что записалось в куки. Незнаю, может это у меня куки не принимаются просто, хотя вроде полностью разрешены все и везде принимались...

   
 
 автор: cheops   (08.09.2005 в 12:36)   письмо автору
 
   для: Zew   (08.09.2005 в 12:05)
 

Что-то я вообще этих cookie у себя на машине найти не могу - прикрепите пожалуйста этот файл к своему сообщению, чтобы мы могли потестировать на локальной машине.

   
 
 автор: Zew   (08.09.2005 в 12:50)   письмо автору
1.4 Кб
 
   для: cheops   (08.09.2005 в 12:36)
 

Хех, я их тоже пыталась найти, и аналогично не нашла. Ок, прикрепляю.

   
 
 автор: cheops   (08.09.2005 в 17:16)   письмо автору
 
   для: Zew   (08.09.2005 в 12:50)
 

cookie не могут быть установлены в таком скрипте, хотя бы из-за того, что в начале идёт блок
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body>

Так как cookie ставятся через HTTP-заголовки отослать их не представляется возможным, так как HTTP-заголовки отправляются в обязательном порядке до тела документа.

   
 
 автор: Zew   (08.09.2005 в 21:24)   письмо автору
 
   для: cheops   (08.09.2005 в 17:16)
 

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

   
 
 автор: cheops   (09.09.2005 в 00:14)   письмо автору
 
   для: Zew   (08.09.2005 в 21:24)
 

Можно поместить весь вывод в буфер, при помощи функций управления выводом. В конце страницы - вывести всю информацию оптом. О том как это сделать можно почитать в теме по ссылке http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=148.

   
 
 автор: Zew   (10.09.2005 в 17:28)   письмо автору
 
   для: cheops   (09.09.2005 в 00:14)
 

Хм, а не может быть так, что на сервере просто эти куки не разрешены? Что я только не пробывала, но не работают даже простейшие скрипты из вашего учебника. Вот этот например:

<?
  $counter
++;
  
setcookie("counter",$counter,mktime(0,0,0,01,25,2090));
  echo(
"Вы посетили эту страницу $counter раз");
?>

Точнее, он работает, но если закрыть браузер, отсчет начинается с единицы, а куки в папке как небыло, так и нет... *_*

ЗЫ: сайт мой лежит на www.sweb.ru и вроде как там все должно поддеживаться (уж за 80 баксов в год должно бы, во всяком случае).

   
 
 автор: cheops   (10.09.2005 в 20:28)   письмо автору
 
   для: Zew   (10.09.2005 в 17:28)
 

Уменьшите год хотя бы до 2010 - вы просто переходите за границу типа - максимальный год 2038 - при этом кука устанавливается как сессионая, т.е. её время жизни ограничено временем сеанса. Подробности в теме по ссылке http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=149

   
 
 автор: Zew   (10.09.2005 в 21:43)   письмо автору
 
   для: cheops   (10.09.2005 в 20:28)
 

Результат тот же - куки на месте нет... *_*

   
 
 автор: cheops   (10.09.2005 в 21:53)   письмо автору
 
   для: Zew   (10.09.2005 в 21:43)
 

Странно у меня этот код работатет на ура - после закрытия браузера - число стартует с последнего значения - у вас разрешено в браузере установка несессионных кук?

   
 
 автор: Zew   (10.09.2005 в 21:56)   письмо автору
 
   для: cheops   (10.09.2005 в 21:53)
 

Ну число-то у меня тоже стартует правильно. Но это если просто обновлять страницу. А если закрыть ее вместе с браузером - все, отсчет начинается с начала.
Куки разрешены все, и в папке с куками их несколько десятков... А собственный не устанавливается... *_*

   
 
 автор: Zew   (10.09.2005 в 21:59)   письмо автору
 
   для: Zew   (10.09.2005 в 21:56)
 

Тьфу, звиняйте, видимо это был глюк или браузера или моего изношенного винда - вышла, перезагрузилась, попробывала еще раз, и теперь кука на месте. =)
Спасибо еще раз. ^_~

   
Rambler's Top100
вверх

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