Урок 9. Регистрация и авторизация пользователей
Прислано AMD на Сентябрь 28 2011 01:40:26
Ну вот и добрались до регистрации пользователей и созданию

закрытой части сайта.





Сегодня для этой цели мы используем сессии. Вариант с

использованием кук мы рассмотрим на следующей неделе.






Мой вариант скрипта лежит тут



http://allmustdie.citadelchaos.ru/uroki/6






на первой странице находится форма для авторизации зарегенных

пользователей и ссылка на форму для регистрации.






зарегистрированный пользователь введя пароль попадает в закрытую

зону сайта. если попытаеться войти в закрытую зону напрямую то

не получится



http://allmustdie.citadelchaos.ru/uroki/6/member.php













собственно скипт состоит из нескольких файлов


func.php - библиотека наших функций


index.php - начальная страница


login.php - авторизация пользователей


member.php - закрытая часть сайта



reg.php - форма для регистрации


reg_new.php - внос нового юзера в базу


user.dat - база юзеров





для php файлов права поставте 755, для user.dat 666





 






теперь разберем содержимое файлов


 












func.php - библиотека наших функций






 







цитата




<?


session_start();









//проверка правильности заполнения поля е-мейл





function email_test($email)


{


if(preg_match("/^[\.A-z0-9_\-]+[@][A-z0-9_\-]+([.][A-z0-9_\-]+)+[A-z]{1,4}$/",


$email))


return true;


else


return false;





}









//внос в базу нового юзера





function register($name,$email,$password)


{


$pass=md5($password);



$all_users = file("user.dat");


foreach($all_users as $user_line)


{


$user_arr = explode("|", $user_line);






if(strcasecmp($user_arr[0],$name)==0){ msg("error",

"Ошибка!!!", "Пользователь с именем $name уже

зарегистрирован!", "javascript:history.go(-1)"); }


}



$old_db = file("user.dat");


$new_db = fopen("user.dat", "w");


fwrite($new_db,"$name|$pass|$email|\n");



foreach($old_db as $old_db_line){


$old_db_arr = explode("|", $old_db_line);


fwrite($new_db,"$old_db_line");


}


fclose($new_db);









echo "Пользователь зарегистрирован!";


}








//проверка совпадения пароля1 и пароля2 + проверка длины


пароля





function pass_test($pass1,$pass2)


{


if(strcasecmp($pass1,$pass2)<>0){ msg("error", "Ошибка!!!",


"Пароли не совпадают!", "javascript:history.go(-1)"); }





if(strlen($pass1)<6 || strlen($pass1)>20){ msg("error",

"Ошибка!!!", "Длина пароля должна быть между 6 и 20


символами!", "javascript:history.go(-1)"); }





}





//вывод сообщения на экран






function msg($type, $title, $text, $back=FALSE){


echo"<table border=0 cellpading=0 cellspacing=0 width=100%

height=100%><tr><td >$text";


if($back){



if($type=="yeslog")


echo"<br /><br> <a href=\"$back\">Для входа в закрытую зону

нажмите тут.</a>";



else


echo"<br /><br> <a href=\"$back\">Для возврата нажмите

тут.</a>";



}


echo"</td></tr></table>";


exit();


}






//проверка авторизации


function check_user()


{


global $valid_user;


if(session_is_registered("valid_user"))



echo $valid_user,"! ";


else


msg("error", "Ошибка!!!", "Вы не авторизированны!",


"index.php");


}


?>


 











session_start();


запускаем сессию. поидее надо эту функцию вызвать в каждом нашем

файле. но мы в каждом файле загружаем с помощью include файл

func.php. и потому вставит тут мы просто экономим место и время.








 








цитата




//проверка правильности заполнения поля е-мейл





function email_test($email)



{


if(preg_match("/^[\.A-z0-9_\-]+[@][A-z0-9_\-]+([.][A-z0-9_\-]+)+[A-z]{1,4}$/",

$email))


return true;


else



return false;





}


 










как и в гостевой - тут мы проверяем соответсвие емейла маске и


по результатам проверки функция возвращает значения. true - если

проверка пройдена. false- если проверка не прошла.





 







цитата





//внос в базу нового юзера





function register($name,$email,$password)


{


$pass=md5($password);


$all_users = file("user.dat");



foreach($all_users as $user_line)


{


$user_arr = explode("|", $user_line);





if(strcasecmp($user_arr[0],$name)==0){ msg("error",


"Ошибка!!!", "Пользователь с именем $name уже

зарегистрирован!", "javascript:history.go(-1)"); }


}


$old_db = file("user.dat");



$new_db = fopen("user.dat", "w");


fwrite($new_db,"$name|$pass|$email|\n");


foreach($old_db as $old_db_line){


$old_db_arr = explode("|", $old_db_line);



fwrite($new_db,"$old_db_line");


}


fclose($new_db);








echo "Пользователь зарегистрирован!";



}


 










$pass=md5($password); - мы шифруем пароль с помощью функции md5.

эта функция создает хеш пароля. расшифровать такой пароль

невозможно. взлом возможен только перебором.






$all_users = file("user.dat");


foreach($all_users as $user_line)


{


$user_arr = explode("|", $user_line);






if(strcasecmp($user_arr[0],$name)==0){ msg("error", "Ошибка!!!",

"Пользователь с именем $name уже зарегистрирован!",

"javascript:history.go(-1)"); }



}


открываем файл м проверяем не был ли такой юзер зареген ранее





$old_db = file("user.dat");


$new_db = fopen("user.dat", "w");



fwrite($new_db,"$name|$pass|$email|\n");


foreach($old_db as $old_db_line){


$old_db_arr = explode("|", $old_db_line);


fwrite($new_db,"$old_db_line");



}


fclose($new_db);


считываем файл. потом отрываем файл на запись. записываем нового

юзера и потом записываем старых. закрываем файл








//проверка совпадения пароля1 и пароля2 + проверка длины пароля






function pass_test($pass1,$pass2)


{


if(strcasecmp($pass1,$pass2)<>0){ msg("error", "Ошибка!!!",

"Пароли не совпадают!", "javascript:history.go(-1)"); }






if(strlen($pass1)<6 || strlen($pass1)>20){ msg("error",

"Ошибка!!!", "Длина пароля должна быть между 6 и 20 символами!",

"javascript:history.go(-1)"); }






}





проверяем что бы при регистрации совпадали введый пароль и

повтор пароля. + проверяем что бы пароль был длиной от 6 до 20

символов.






//вывод сообщения на экран





function msg($type, $title, $text, $back=FALSE){


echo"<table border=0 cellpading=0 cellspacing=0 width=100%

height=100%><tr><td >$text";



if($back){


if($type=="yeslog")


echo"<br /><br> <a href=\"$back\">Для входа в закрытую зону


нажмите тут.</a>";


else


echo"<br /><br> <a href=\"$back\">Для возврата нажмите


тут.</a>";


}


echo"</td></tr></table>";


exit();



}





функция вывода сообщения на экран. в зависимости от $type

сообщения будут разные. $back=FALSE говорит о том что при

получении переменных функция может не получить эту переменную и

тогда ее значение по умолчанию будет FALSE. если же переменная


передана то это будет ссылка для перехода.





function check_user()


{


global $valid_user;


if(session_is_registered("valid_user"))



echo $valid_user,"! ";


else


msg("error", "Ошибка!!!", "Вы не авторизированны!",


"index.php");


}





эта функция проверяет авторизирован ли пользователь пытающийся

зайти в закрытую зону сайта


session_is_registered("valid_user") - проверяет созданали в


сессии переменная valid_user и какое значение она имеет. эту

перевенную мы создаем при авторизации. и потому прямой заход в

закрытую зону не удасться.








index.php - начальная страница






 







цитата




<?


include("func.php");






?>


<h2>Вход</h2>


<form method="POST" action="login.php">



<table border="0" cellpadding="0" cellspacing="0"

style="border-collapse: collapse" bordercolor="#111111"


width="33%" id="AutoNumber1">


<tr>


<td width="40%" bgcolor="#C0C0C0">Имя</td>



<td width="60%" bgcolor="#C0C0C0"><input type="text"

name="namelog" size="20"></td>



</tr>


<tr>


<td width="40%">Пароль</td>


<td width="60%"><input type="password" name="passlog"


size="20"></td>


</tr>


</table>


<p><input type="submit" value="Войти" name="B1"></p>



<p><a href="reg.php">Регистрация</a></p>


</form>


 











первым делом мы загружаем файл с функциями (за одно создаем

сессию - напомню она создается в файле func.php)


далее идет форма за авторизации и ссылка на форму для

регистрации новых юзеров.


при авторизации форма пересылает нас на файл login.php. туда же

методом POST передаются введенные данные. и потому значения


логина и пароля хранятся в переменных $HTTP_POST_VARS["namelog"]

и $HTTP_POST_VARS["passlog"].





login.php - авторизация пользователей


 








цитата




<?





include("func.php");






$all_users = file("user.dat");


foreach($all_users as $user_line)


{


$user_arr = explode("|", $user_line);






if($user_arr[0]==$HTTP_POST_VARS["namelog"])


{


if($user_arr[1]==md5($HTTP_POST_VARS["passlog"]))


{



echo $valid_user=$HTTP_POST_VARS["namelog"];


session_register("valid_user");


msg("yeslog","Авторизация","Авторизация прошла успешно!",


"member.php");


}


else


msg("error","Авторизация","Пароль пользователя $user_arr[0]


неверен!", "javascript:history.go(-1)");


}


else


msg("error","Авторизация","Ошибка авторизации! Пользователь


необнаружен!", "javascript:history.go(-1)");





}





?>






 







введеные данные сравниваются с данными из базы.


причем введенны пароль хранящийся в $HTTP_POST_VARS["passlog"]

мы шифруем md5($HTTP_POST_VARS["passlog"]) и уже в таком виде


сравниваем с сохраненным паролем.


в зависимости от результатов проверки мы получим разные

результаты.


проверяем совпадение введенного логина с базой. если не

совпадает то об этов сообщается. если совпало то проверяет у

данного пользователя пароль. если не совпал то сообщает об этом.


совпало то сообщается об успешной авторизации и разрешается вход

в закрытую часть сайта.


так же создаем переменную сессии


$valid_user=$HTTP_POST_VARS["namelog"];


session_register("valid_user");



она получает значение равное введенному логину





member.php - закрытая часть сайта


<?





include("func.php");



if($act=='exit')


{


session_unregister("valid_user");


session_destroy();


}






check_user();


echo "Вы вошли в закрытую зону<br><br><br>";


echo "<a href='member.php?act=exit'>Выход</a>";



?>





check_user(); - вызывает фукцию для проверки пройдена ли

авторизация





echo "<a href='member.php?act=exit'>Выход</a>"; - ссылка на


выход из закрытой зоны. в алресной строке заадается переменная

act. если она равна exit то происходит выход





if($act=='exit')


{


session_unregister("valid_user");



session_destroy();


}





session_unregister("valid_user"); - убиваем переменную сессии

valid_user






session_destroy(); - убиваем сессию








reg.php - форма для регистрации


 







цитата





<?


include("func.php");


?>


<h2>Регистрация</h2>



<form method="POST" action="reg_new.php">


<table border="0" cellpadding="0" cellspacing="0"


style="border-collapse: collapse" bordercolor="#111111"

width="33%" id="AutoNumber1">


<tr>



<td width="40%" bgcolor="#C0C0C0">Имя</td>


<td width="60%" bgcolor="#C0C0C0"><input type="text"


name="name" size="20"></td>


</tr>


<tr>


<td width="40%" bgcolor="#C0d0d0">Пароль (длина пароля от 6


до 20 символов)</td>


<td width="60%" bgcolor="#C0d0d0"><input type="password"

name="password" size="20"></td>



</tr>


<tr>


<td width="40%" bgcolor="#C0d0d0">Повтор пароля</td>


<td width="60%" bgcolor="#C0d0d0"><input type="password"


name="password2" size="20"></td>


</tr>


<tr>


<td width="40%" bgcolor="#C0C0C0">E-mail</td>



<td width="60%" bgcolor="#C0C0C0"><input type="text"

name="email" size="30"></td>



</tr>


</table>


<p><input type="submit" value="Войти" name="B1"></p>









 







форма для регистрации нового пользователя.


для внесения нового пользователя форма вызывает файл reg_new.php






reg_new.php - внос нового юзера в базу




 







цитата




<?






include("func.php");








if(!email_test($HTTP_POST_VARS["email"]))


{



msg("error","Ошибка !!!","Поле e-mail заполнено неверно!",

"javascript:history.go(-1)");


}






pass_test($HTTP_POST_VARS["password"],$HTTP_POST_VARS["password2"]);





register($HTTP_POST_VARS["name"],$HTTP_POST_VARS["email"],$HTTP_POST_VARS["password"]);



?>










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

ошибка то выводится сообщение об этом и выполнение прекращается






потом проверяем правильность паролья (длина и совпадения пароля

и повтора пароля) если ошибка то выводится сообщение об этом и

выполнение прекращается





если все прошло ОК. то вызывается функция register. которая

получив данные заносит нового пользователя в базу.












как я уже говорил следующий раз мы рассмотрим

такую же регистрацию но с использованием КУК.


а изучив все это сможем наконец начать заниматься разработкой

портала.



+++