Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Авторизация посетителей на PHP




Рассмотрим систему авторизации пользователей (регистрация, login/logout, доступ к закрытым страничкам, поддтвеждение по e-mail).

Нам понадобятся: вебсервер, PHP, MySQL. Предполагается, что вы с этим всем уже знакомы на определенном уровне.

Для начала создадим в базу данных, допустим, "authorize" и таблицу "users" в ней. Работать с БД MySQL очень удобно с помощью инструмента PhpMyAdmin, который можно скачать здесь.

Итак, таблица "users":

Поле Тип По умолчанию Дополнительно
id mediumint(9)   auto_increment
login varchar(32)   index unique
pass varchar(32)    
email varchar(64)   index unique
status tinyint(2)    
timestamp int(10)    

Теперь сделаем страничку регистрации и скрипт, заносящий данные о юзере в базу. Нам понадобится 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" должна быть строка вида:

1 login 76d80224611fc919a5d54f0ff9fba446 eqw@asd.ru 0 1197730343

Теперь создадим скрипт, активирующий пользователей. Система его будет такова:

· • Пользователь приходит по ссылке с 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" такого вида:

<?if (isset($_POST['login'])) { $passwordHash = md5($_POST['password']); $login = $_POST['login']; // Проверка логина на плохие смиволы if (!preg_match("/^\w{3,}$/", $login)) { die('Неправильный логин!'); } $link = mysql_connect('localhost',$dbuser,$dbpass); if (!$link) { die('Не удалось соединиться с БД'); }else{ mysql_select_db('authorize', $link); $res = mysql_query("SELECT status FROM users WHERE login='$login'", $link); // Есть ли пользователь с таким логином? if (mysql_num_rows($res) < 1) { mysql_close($link); die('Такого пользователя нет!'); } // Какой статус у пользователя? if (mysql_result($res, 0)!= 1) { mysql_close($link); die('Логин не активирован!'); } // Стартуем сессию и записываем логин в суперглобальный массив $_SESSION session_start(); $_SESSION['user'] = $login; mysql_close($link); // Если определена страница с которой мы пришли, // на нее и переадресуем, либо на главную if (isset($_SERVER['HTTP_REFERER'])) { header ("location: ".$_SERVER['HTTP_REFERER']); }else { header ("location: index.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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...