Авторизация посетителей на PHP
⇐ ПредыдущаяСтр 2 из 2 Рассмотрим систему авторизации пользователей (регистрация, login/logout, доступ к закрытым страничкам, поддтвеждение по e-mail). Нам понадобятся: вебсервер, PHP, MySQL. Предполагается, что вы с этим всем уже знакомы на определенном уровне. Для начала создадим в базу данных, допустим, "authorize" и таблицу "users" в ней. Работать с БД MySQL очень удобно с помощью инструмента PhpMyAdmin, который можно скачать здесь. Итак, таблица "users":
Теперь сделаем страничку регистрации и скрипт, заносящий данные о юзере в базу. Нам понадобится html-файл с такой формой (естественно, если хотите иметь больше информации о юзере, можно добавить соответствующие поля, изменить скрипт и таблицу в БД): <form action="registration.php" method="post"><table><tr> <td>Логин*:</td> <td><input type="text" name="rLogin" value="" size="25" maxlength="30" /></td></tr><tr> <td>Пароль*:</td> <td><input type="password" name="rPass" value="" size="25" maxlength="30" /></td></tr><tr> <td>Повторите пароль*:</td> <td><input type="password" name="rPass2" value="" size="25" maxlength="30" /></td></tr><tr> <td>E-mail*:</td> <td><input type="text" name="rEmail" value="" size="25" maxlength="30" /></td></tr><tr> <td></td> <td><input type="reset" name="reset" value="Очистить" /> <input type="submit" name="ok" value="Готово" /></td></tr></table></form>Теперь создадим скрипт "registration.php", который и будет обрабатывать форму регистрации: <?if ($_SERVER['REQUEST_METHOD'] == 'POST') { $rLogin = trim($_POST['rLogin']); $rPass = trim($_POST['rPass']); $rPass2 = trim($_POST['rPass2']); $rEmail = trim($_POST['rEmail']); if ($rLogin == '') { die("Поле 'Логин' не заполнено<br />\n"); // Логин может состоять из букв, цифр и подчеркивания }elseif (!preg_match("/^\w{3,}$/", $rLogin)) { die("В поле 'Логин' введены недопустимые символы<br />\n"); } if ($rEmail == '') { die("Поле 'E-mail' не заполнено<br />\n"); // Проверяем e-mail на корректность }elseif (!preg_match("/^[a-zA-Z0-9_\.\-]+@([a-zA-Z0-9\-]+\.)+[a-zA-Z]{2,6}$/", $rEmail)) { die("Указанный 'E-mail' имеет недопустимый формат<br />\n"); } if ($rPass == '' || $rPass2 == '') { die("Поле 'Пароль' не заполнено<br />\n"); }elseif($rPass!== $rPass2) { die("Поля 'Пароль' и 'Повтор пароля' не совпадают<br />\n"); // Пароль может состоять из букв, цифр и подчеркивания }elseif(!preg_match("/^\w{3,}$/", $rPass)) { die("В поле 'Пароль' введены недопустимые символы<br />\n"); } // В базе данных у нас будет храниться md5-хеш пароля $mdPassword = md5($rPass); // А также временная метка (зачем - позже) $time = time(); // Устанавливаем соединение с бд(не забудьте подставить ваши значения сервер-логин-пароль) $link = mysql_connect('localhost', $dbuser, $dbpass); if (!$link) { die("Не могу соединиться с базой данных"); }else { // Выбираем базу данных mysql_select_db('authorize', $link); // Записываем в базу (не используем addslashes - экранировать нечего) mysql_query("INSERT INTO users (login, pass, email, timestamp) VALUES ('$rLogin','$mdPassword','$rEmail',$time)",$link); if (mysql_error($link)!= "") { die("Пользователь с таким логином уже существует, выберите другой<br />\n"); }// Получаем Id, под которым юзер добавился в базу$id = mysql_result(mysql_query("SELECT LAST_INSERT_ID()", $link), 0);// Составляем "keystring" для активации$key = md5(substr($rEmail, 0,2).$id.substr($rLogin, 0,2));$date = date("d.m.Y",$time);// Компонуем письмо$title = 'Потвеждение регистрации на сайте Somwhere.net';$headers = "Content-type: text/plain; charset=windows-1251\r\n";$headers.= "From: Администрация Somwhere.net \r\n";$subject = '=?koi8-r?B?'.base64_encode(convert_cyr_string($title, "w","k")).'?=';$letter = <<< LTR Здравствуйте!Что-то там..... Ваши регистрационные данные: логин: $rLogin пароль: $rPass Для активации аккаунта вам следует пройти по ссылке: http://somewhere.net/activation.php?login=$rLogin&key=$key Данная ссылка будет доступна в течении 5 дней. $dateLTR;// Отправляем письмоif (!mail($rEmail, $subject, $letter, $headers)) { // Если письмо не отправилось, удаляем юзера из базы mysql_query("DELETE FROM users WHERE login='".$login."' LIMIT 1", $link); echo 'Произошла ошибка при отправке письма. Попробуйте зарегистрироваться еще раз.';}else { echo 'Вы успешно зарегистрировались в системе. На указанный вами e-mail было отправлено письмо со ссылкой для активации аккаунта. У вас 5 дней!';} mysql_close($link); }}?>Теперь у нас в таблице "users" должна быть строка вида:
Теперь создадим скрипт, активирующий пользователей. Система его будет такова: · • Пользователь приходит по ссылке с GET-данными "login" и "key" · • Берем из базы id, login, e-mail, status и timestamp юзера (если юзер есть). Проверяем статус (активирован уже или нет). Проверяем разницу текущей временной метки и метки из базы, если больше 5*24*60*60 - до свидания · • Составляем новую "keystring" по тем же правилам, что и старую. Сравниваем. Не равны - до свидания · • Если ключевые строки равны - апдейтим статус до 1. А код таков: <?if (isset($_GET['login']) && isset($_GET['key'])) { $login = $_GET['login']; $key = $_GET['key']; // Делаем проверку login на нехорошие символы if (!preg_match("/^\w{3,}$/", $login)) { die('Неправильная ссылка!'); } $time = time(); $link = mysql_connect('localhost',$dbuser,$dbpass); if (!$link) { die('Не удалось соединиться с БД'); }else{ mysql_select_db('authorize', $link); $res = mysql_query("SELECT id, email, status, timestamp FROM users WHERE login='$login' LIMIT 1", $link); // Есть ли пользователь с таким логином? if (mysql_num_rows($res)!= 1) { mysql_close($link); die('Такого пользователя нет!'); } $user = mysql_fetch_row($res); // Может он уже активен? if ($user[2] == 1) { mysql_close($link); die('Данный логин уже подтвержден!'); } // Успел ли юзер активировать логин? (если нет - удаляем из базы) if ($user[3] - $time > 5*24*60*60) { mysql_query("DELETE FROM users WHERE login='$login' LIMIT 1", $link); mysql_close($link); die('Срок активации истёк! Регистрируйтесь заново.'); } $key1 = md5(substr($user[1], 0,2).$user[0].substr($login, 0,2)); // Поверяем "keystring" if ($key1!= $key) { mysql_close($link); die('Неправильная контрольная сумма!'); } // Если все проверки пройдены - активируем логин! mysql_query("UPDATE users SET status = 1 WHERE login='$login'", $link); mysql_close($link); }}?>Так, с регистрацией мы покончили, теперь сделаем форму для авторизации, например, такую: <form method="post" action="login.php"> <table> <tr> <td>Логин</td> <td><input type="text" name="login"></td> </tr> <tr> <td>Пароль</td> <td><input type="password" name="password"></td> </tr> <tr> <td colspan="2"><input type="submit" value="Войти"></td> </tr> </table></form>Вставляйте эту форму в любое место страницы, как того требует дизайн. Обработчиком формы будет у нас файл "login.php" такого вида:
Напишем сразу скрипт "logout.php", работающий как "выход из системы": <? session_start(); if (isset($_SESSION['user'])) { // удаляем элемент "user" unset($_SESSION['user']); } if (isset($_SERVER['HTTP_REFERER'])) { header ("location: ".$_SERVER['HTTP_REFERER']); }else { header ("location: index.php"); }?>Ну вот, юзер авторизован. Осталась малость: • В начале каждого документа стартовать сессию функцией session_start() • Проводить проверку на присутствие в массиве $_SESSION элемента user. На основе нее выдавать "секретный" документ или общий. • Вместо формы для авторизации распечатывать приветствие и ссылку на "logout.php" Вот простейший пример документа: <?session_start();if (isset($_SESSION['user'])) { $auth = "Привет ".$_SESSION['user']."!<br />\n"; $auth.= "<a href='logout.php'>Выйти</a>"; $docum = "Эта информация только для зарегистрированных";}else { $auth = <<< AUTH <form method="post" action="login.php"> <table> <tr> <td>Логин</td> <td><input type="text" name="login"></td> </tr> <tr> <td>Пароль</td> <td><input type="password" name="password"></td> </tr> <tr> <td colspan="2"><input type="submit" value="Войти"></td> </tr> </table> </form>AUTH; $docum = "Эта общая информация";}?><html><head></head><body><? echo $auth;?><hr /><? echo $docum;?></body></html>
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|