Статья:Модуль регистрации/авторизации.

Оригинальный адрес:http://www.web-maste.ru/articles.php?c=4&s=2&a=39
Здравствуй, уважаемый читатель!

Это третья статья из нашего цикла статей "Помодульное построение Веб-сайта" под названием "Модуль аккаунта пользователя".

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

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

Итак, приступим к работе, для начала осветив общий алгоритм действия.
1.Шаг "Регистрация".Здесь мы выведем форму с полями которые должен заполнить пользователь.После проверки введенных данны
х, мы запишем их в файл в таком формате:Логин|пароль(зашифрованный алгоритмом MD5)|e-mail|сайт|любое поле на ваш выбор.Я выбрал поле Город.После записи в файл вы выдадим пользователю сообщение с поздравлением и предложим ему войти в аккаунт.Регистрация будет происходить в файле reg.php.
2.Шаг "Авторизация".Весь процесс авторизации будет проходить в файле authorize.php.Мы выведем пользователю 2 поля:Логин и Пароль.После введения этих данных, мы создадим хеш md5 из введенного пароля, откроем файл с пользователями для чтения, и в цикле,распределив информацию о пользователе на временные переменные, сверим логин-с записанным логином, хеш пароля с записанным хешем пароля.Если найдется хоть одно совпадение, мы выводим сообщение с поздравлением, выходим из цикла и отправляем пользователя на первую страницу "пользовательского аккаунта" которую вы сами установите.
3.Шаг "Аккаунт пользователя".Файлы могут быть любыми, назначенными вами.После авторизации, если пользователь зашел на приватную страницу, необходимо проверить, авторизовался ли он в системе?Это будет выполнять специальная функция, положительным исходом работы которой будет продолжение работы, а отрицательным будет выход из программы.
Теперь создадим все пошагово:
1.Для начала модифицируем файл config.php, внесем в него изменения относительно шага регистрации.Укажем файл, в котором будут
располагаться аккаунтные данные юзероф.Вот код файла после изменения:



<?php
$conf[name]="Офф.Сайт 1236 школы г.Москвы.";
$conf[keyws]=" школа, учеба, москва, 1236, уроки";
$conf[desc]="Это лучший сайт о школе номер 1236!Наша школа самая лучшая!";
$conf[copyr]="(c)www.1236school.ru копирование материалов с сайта запрещено, будем бить, возможно даже ногами!";
$conf[userfile]="ourusers.txt";
?>




Как видите я назвал файл ourusers.txt.Теперь приступим непосредственно к файлу регистрации:reg.php.Вы ещё не создали его?Тогда мы идем к вам!Создайте этот файл в корневом подкаталоге сайта.По старой доброй традиции я напишу код этого файла, а после чего его построчно прокомментирую.



<?php
require "header.php";
echo " <center><h3>Регистрация</h3></center>";
if($submit){//X Начало
$error="";//Y начало
if($login=="")
$error.="Вы должны ввести логин!<br>";
if($email=="")
$error.="Вы должны ввести e-mail!<br>";
if($password=="" or ($cpassword==""))
$error.="Вы должны ввести оба пароля!<br>";
if($password!=$cpassword)
$error.="Пароли не совпадают!<br>";
if($error!=""){
echo "<div style='color:red;font-weight:bolder;'>$error</div>";
}//Y конец
else{//W начало
$login=str_replace("|","",$login);//Z начало
$email=str_replace("|","",$email);
$site=str_replace("|","",$site);
$city=str_replace("|","",$city);//Z конец
$pass=md5($password);//1
$users1=file($conf[userfile]);//2
foreach($users1 as $v){//3
list($log1,$pass1,$email1,$site1,$city1)=split("\|",$v);//4
if($log1==$login || ($email1==$email)||($site1==$site))//5
$add_user=0;//5
else//6
$add_user=1;//6
}//7
if($add_user==1){//8
$fp=fopen($conf[userfile],"a+");//9
fwrite($fp,"$login|$pass|$email|$site|$city\n")or die('');//10
fclose($fp);//11
echo "Спасибо за регистрацию!Вы можете войти в ваш аккаунт в разделе <a href='authorize.php'> авторизация</a>";//12
}//13
else//14
echo "Пользователь с похожими данными уже зарегистрирован.";//14
}//W конец
}//X конец
//U начало
echo "<center><form method='post'>
Поля отмеченные звездой(*) обязательны для заполнения.<br>
Ваш логин*:<br><input type='text' name='login' value='$login'><br>
Ваш пароль*:<br><input type='password' name='password' value='$password'><br>
Подтвердите пароль*:<br > <input type='password' name='cpassword' value='$cpassword'><br>
Ваш e-mail*:<br><input type='text' name='email' value='$email'><br>
Ваш сайт:<br><input type='text' name='site' value='$site'><br>
Ваш город:<br><input type='text' name='city' value='$city'><br>
<input type='submit' name='submit' value='Зарегистрироваться!'>
</form></center>
";
//U конец
require "footer.php";
?>



Для начала обозначу некоторые блоки, которые здесь приведены в таком виде: X начало...X конец.В этих блоках происходит какое-то
однообразное действие или они просто обозначают часть программы.
Блок Х:Он обозначает участок кода программы, когда нажата кнопка "Зарегистрироваться", которой присвоено имя submit.
Блок Y:вы уже должны знать, что это за блок, т.к. он использовался в нашем предыдущем модуле гостевой книги.Здесь происходит проверка данных и запись ошибок в специальную переменную $error, которая в последних 3 строчках проверяется на пустоту, и в случае наличия в ней текста выводится на экран с сообщением об ошибке.В случае пустоты данной переменной(ошибок не обнаружено) программа переходит к блоку W, в котором и происходит добавление пользователя.
Блок W(основной):программа попадает сюда в том случае, если $error=="".Здесь происходит во-первых удаление зарезервированного
символа | из данных, введенных пользователем, во-вторых шифрование пароля, в третьих проверка на наличие пользователя с похожими данными, в четвертых, в случае остуствия похожего пользователя, происходит добавление пользователя(запись в файл с данным
и) и вывод соотвествующего сообщения, в противном случае извещение о наличии такого пользователя.
Блок Z:в нем происходит описанная выше замена символа | на пустоту в логине, емэйле, сайте, городе.Это так, на всякий случай.
Блок U:здесь выводится форма регистрации.Все поля установлены в значение по умолчанию, введенное пользователем.
А теперь прокомментирую строки блока W.
1.Создаем из переменной $password хеш пароля функцией md5(), и записываем его в переменную $pass.
2.Превращаем каждую строку файла с пользователями в элемент массива $users1.(Мы уже использовали эту функцию в "Модуле гостевой книги")
3.Открываем цикл foreach, который на время присваивает поочередно каждый элемент массива $users1 переменной $v, с которой удобнее работать.
4.Разделяем строку $v сепаратором "|" на несколько частей, которые потом записываем в переменные функцией list().
5.Проверяем сходство логина, емэйла с каждой из записей в файле, и вслучае нахождения совпадения хоть одного из параметров, устанавливаем переменную $add_user в ноль, то есть пользователя НЕЛЬЗЯ регистрировать.
6.В противном случае устанавливаем $add_user в 1, т.е. пользователя МОЖЖНО регистрировать.
7.Хватит зацикливаться, закрываем цикл проверки.
8.Если $add_user равно 1, значит можно добавить пользователя, чем мы и займемся.
9.Открываем в режиме добавления в конец файла пользовательский файл.
10.Записываем туда строку заранее определенного формата.Если не удается записать, лучше "убить программу".
11.Закрываем файл.
12.Выводим сообщение с поздравлением и приглашаем пользователя авторизоваться.
13.Закончилась часть программы, где переменная $add_user равна 1.Теперь мы представляем что делать в противном случае.
14.Если переменная $add_user не равна 1, то выводим сообщение что такой пользователь уже зарегистрирован.
Вот и все, а вы боялись:)Регистрацию мы закончили, перейдем к аффторизации.
2.Для авторизации нам понадобится
а)модифицировать файл conf.php и добавить туда имя файла, которое будет являться "индексом" приватной зоны.Вот модифицированный файл conf.php:



<?php
$conf[name]="Офф.Сайт 1236 школы г.Москвы.";
$conf[keyws]=" школа, учеба, москва, 1236, уроки";
$conf[desc]="Это лучший сайт о школе номер 1236!Наша школа самая лучшая!";
$conf[copyr]="(c)www.1236school.ru копирование материалов с сайта запрещено, будем бить, возможно даже ногами!";
$conf[userfile]="ourusers.txt";
$conf[account_file]="account_index.php";
?>




Здесь мы добавили переменную $conf[account_file] в которой написано, куда направлять пользователя после успешной авторизации.
б)Модифицировать файл header.php, т.к. нам придется работать с сессиями.Вот его код(обновленный):



<?php
error_reporting(0);//1
session_start();//мы запустили сессию для этого пользователя.
include "conf.php";//2
$fp=fopen("./template/main.html","r");//3
$template=fread($fp,filesize("./template/main.html"));//4
fclose($fp);//5
list($up_template,$down_template)=split("\[content\]",$template,2);//6
$up_template=str_replace("[name]",$conf[name],$up_template);//7
$up_template=str_replace("[keywords]",$conf[keyws],$up_template);//8
$up_template=str_replace("[descr]",$conf[desc],$up_template);//9
echo $up_template;//10
?>




в)Создать файл authorize.php в корневом подкаталоге вашего сайта.
Теперь мы напишем код файла авторизации, и я его прокомментирую построчно.Этот файл довольно таки простой и понятный:)



<?php
require "header.php";
if($submit){//X Начало
$error="";//Y начало
if($login=="")
$error.="Вы должны ввести логин!<br>";
if($password=="")
$error.="Вы должны ввести пароль!<br>";
if($error!=""){
echo "<div style='color:red;font-weight:bolder;'>$error</div><br><a href='authorize.php'>Войти ещё раз</a>";
}//Y конец
else{//W начало
$login=str_replace("|","",$login);//1
$pass=md5($password);//1
$users1=file($conf[userfile]);//2
foreach($users1 as $v){//3
list($log1,$pass1,$email1,$site1,$city1)=split("\|",$v);//4
if(($log1==$login)&&($pass1==$pass))//5
$have_user=1;//5
else//6
$have_user=0;//6
}//7
if($have_user==1){//8
session_register("user_in_the_room");//9
$user_in_the_room=true;//10
session_register("user_login");//11
$user_login=$login;//12
echo "<meta http-equiv='refresh' content='0;url=$conf[account_file]'>";//13
}//8
else//14
echo "Такого пользователя у нас нет!";//14
}//W конец
}
else{//U начало
echo "<center><form method='post'>
<h3>Вход в аккаунт пользователя</h3>
Ваш логин:<br><input type='text' name='login' value='$login'><br>
Ваш пароль:<br><input type='password' name='password' value='$password'><br>
<input type='submit' name='submit' value='Войти!'>
</form></center>
";
}//U конец
require "footer.php";
?>





Т.к. файл отчасти скопирован с reg.php, то тут остались те же самые блоки, что и в регистрации.Обьяснять их нет смысла, начну сразу
с W блока.
1.Заменяем в логине символ |, а также создаем md5 хеш из пароля, введенного пользователем.
2.Опять превращаем файл в массив...
3.Опять запускаем цикл...
4,5,6,7.Делаем по сути то же самое что и при регистрации, только теперь в случае совпадения логина с логином в файле и пароля с паролем в ффайле, мы устанавливаем переменную $have_user в 1, а если нет то в ноль.Выходим из цикла.
8.Если $hav_user равна 1...
9...то для начала регистрируем ОЧЕНЬ ВАЖЖНУЮ переменную сессии user_in_the_room.
10.Устанавливаем значение в "Правда"
11,12.Регистрируем также переменную сессии user_login и устанавливаем её значение равным логину пользователя.Она нам пригодит
ся, если мы захотим в аккаунте узнать побольше о пользователе.
13.Отправляем пользователя на главную страницу аккаунта, описанную в conf.php, у нас это account_index.php в которой просто написано поздравление о попадании в аккаунт.
Опять 8.Указание что блок, где переменная $have_user была равна одному закончен, начинается другой, с противоположным значением.
14.Т.к. такого пользователя нет, то выдаем сообщение об отсутствии.
А дальше все наверное понятно:)
И так, пройдено два шага, остался 3-один из самых сложных, по крайней мере для понимания.
3.Теперь необходимо включить как то проверку авторизованности юзверя в аккаунте.Мы это сделаем так:модифицируем файл header.php,куда включим функцию проверки авторизованности.Она действует просто:если зарегистрирована переменная
user_in_the_room, значит он авторизовался, вернуть правду, если же нет, то вернуть ложь.Сейчас мы изменим файл header.php, а потом
я покажу, как нужно делать файлы аккаунта для проверки авторизации.
ФФайл header.php:



<?php
error_reporting(0);//1
session_start();
include "conf.php";//2
$fp=fopen("./template/main.html","r");//3
$template=fread($fp,filesize("./template/main.html"));//4
fclose($fp);//5
list($up_template,$down_template)=split("\[content\]",$template,2);//6
$up_template=str_replace("[name]",$conf[name],$up_template);//7
$up_template=str_replace("[keywords]",$conf[keyws],$up_template);//8
$up_template=str_replace("[descr]",$conf[desc],$up_template);//9
echo $up_template;//10
function user_login_checks(){//11
if(session_is_registered("user_in_the_room"))//12
return true;//12
else//13
return false;//13
}//14
?>




Небольшие пояснения к добавленым строчкам
11. Обьявляем функцию с именем user_login_checks без параметров.
12.Проверяем, если переменная сессии user_in_the_room зарегистрирована, то вернуть правду.
13.Если же нет, вернуть ложь.
14.Конец функции.
Итак, мы создали функцию проверки авторизации, теперь на примере файла account_index.php я покажу, как создать файл для узкого круга:)



<?php
require "header.php";
if(!user_login_checks())//1
echo $conf[error_message];//2
else{//3
echo "Поздравляем!";//4
}//5
require "footer.php";
?>




1.Выполняем функцию проверки авторизации.Знак ! говорит что это действие выполнится, если функция вернет false или 0 то есть отрицательный результат.
2.Если это так, и юзер не авторизован, выводим сообщение об ошибке($conf[error_message], модифицируйте файл conf.php и вставьте там новый параметр.Впишите любое сообщение типа "В Бабруйск, ЖЖЫВОТНОЕ!")
3,4,5.Если же функция вернула положительный результат, то вывести основное содержание страницы.Вот от строчки 3 до строчки 5, вы будете вставлять весь контент, все содержание страницы, его увидит только авторизованный пользователь.
Вот мы и создали авторизованную зону, авторизацию и регистрацию ко всему прочему.
Следующая статья опишет 2 модуля:модуль администратора(это будет модифицированный модуль аккаунта пользователя) и ЛЕНТУ НОВОСТЕЙ.
Удачи вам, и множественных орга...побед всмысле:)
З.Ы.теперь попрактикуйтесь и создайте как можно больше файлов для пользователей, создайте наффигацию в основном контенте по этим файлам.
Telegram-канал @overclockers_news - это удобный способ следить за новыми материалами на сайте. С картинками, расширенными описаниями и без рекламы.
Оценитe материал

Возможно вас заинтересует

Популярные новости

Сейчас обсуждают