В обсуждении и разборе моей давней статьи о системе авторизации на PHP и MySQL, кто-то интересовался как сделать опцию "Запомнить" и автоматический вход. Это довольно просто, но так как есть желающие - нужно подробно описать. Я не буду повторять предыдущую статью, а буду на нее ссылаться.
Итак, в форме авторизации добавляем чекбокс для запоминания:
<input type="checkbox" name="remember">
Теперь смотрим наш обработчик этой формы - скрипт "login.php". Сначала рассмотрим т.н. первую авторизацию — при удачной авторизации и если отмечена опция "запомнить", пишем в cookie браузера специальную строку token. Эти строки нужно добавить после открытия сессии в файле "login.php":
$token = md5(time().$login);
if ($_POST['remember']) {
setcookie('token', $token, time() + 60 * 60 * 24 * 14);
}
Сразу после этого, нужно записать ту же строку token, в базу данных, в строку для залогинившегося юзера. Впоследствии мы будем искать по этой строке (когда она придет из куки) нужного пользователя.
mysql_query("UPDATE users SET token='$token' WHERE login='$login'");
Ну вот, теперь остался последний шаг — авторизовать посетителя автоматически при его заходе на сайт. Для этого, после старта сессии, в каждом документе нужно сделать такую проверку:
if (isset($_COOKIE['token']) && !isset($_SESSION['user'])) {
$token = htmlspecialchars($_COOKIE['token']); // на всякий сл.
$res = mysql_query("SELECT login FROM users WHERE token='$token'", $link);
if (mysql_num_rows($res) < 1) {
setcookie('token', '');
}else {
$_SESSION['user'] = mysql_result($res, 0);
}
}: Здесь мы смотрим — если юзер еще не залогинен и пришла нужна кука, ищем запись в базе данных соответствующую данной куке, если запись есть — авторизуем посетителя.
Ну и последний штрих: в скрипте "logout.php", при удалении из сессии пользователя, удаляем его куку:
setcookie('token', '');Вот и все. В прикрепленном архиве можете взглянуть overall на все исходники. И еще напомню: эти скрипты претендуют скорее на звание обучащих, чем на готовое решение. Поэтому не ленитесь, читайте и разбирайтесь. Вопросы можно в каменты.
| Прикрепленный файл | Размер |
|---|---|
| www.rar | 1.8 кб |
Комментарии
UPDATE users SET token='$token' WHERE login='$login'
Лучше данные заэкранировать, например mysql_escape_string или real
$token = htmlspecialchars($_COOKIE['token']); // на всякий сл.
$res = mysql_query("SELECT login FROM users WHERE token='$token'", $link);
А экранирование такого рода вообще не поможет.
Классно! Спасибо!
Вы вобщем-то правы. Заметка призвана лишь описать направление куда можно копать :)
СПАСИБО!!!
Хотелось бы конечно еще функцию "забыли пароль?"
Просто генерируйте новый пароль для данного аккаунта, записывайте в базу хеш, и высылайте пароль на мыло, указанное при регистрации логина.
спасибо)))
Спасибо, очень подробно и понятно.
Что то я туплю походу, но я не вижу смысла запоминания.
Ведь если войти в систему, потом, не выходя, перейти на любой другой сайт, а затем снова зайти на первоначальный сайт, то опять попадёшь на свою страничку (т.е. выхода не будет), т.к. сессию никто не удалял. Может я что то не понимаю?
Если php-сессия истечет, то тут как раз поможет кука.
Теперь ясно, спасибо. Мне просто казалось, что phpsessid записывается на бесконечно-длинный срок (пока не удалишь). Но проблема в том, что куки тоже уже на месяц не запишешь. А пользователь может год не заходить на сайт и потом очень удивиться.
Ужасно глупый и ведущий за собой огромные проблемы способ
>> Ужасно глупый и ведущий за собой огромные проблемы способ
Как иначе?
>>Долго же вы будете делать SELECT по полю `token` в более-менее большой таблице пользователей :)
А как тогда поиск пользователя осуществлять?
спасибо, но не подойдет, если человек хочет запомнить себя с нескольких компьютеров
Если вы хотите заходить с разных компьютеров, то решение простое, достаточно записать хеш не в user а например таблицу session с двумя полями user_id, hash, соответственно пользователя будет определять несколько значений хеша
Последнему коментатору:
Это вы хорошо придумали конечно с дополнительной таблицей, даже буду наверное использовать такой метод, НО как быть с тем, что таблица будет записываться до бесконечности? т.е. в конце концов она будет очень большой, в ней будет очень много хешей для одного и того-же user_id. Ведь мы же не апдейтим хеш для user_id, а записываем каждый раз новую строчку, а иначе у нас не будут работать принцып автовхода с разных компов или браузеров. Че делать будем с этой бедой?
соответственно можно добавить поле дата, и если какое то определенное время с последнего захода истекло, удалять запись, как бы время жизни записи истекает
В одном из комментариев упоминалось о таблице с хеш-ми (1 пользователь - несколько компьютеров), получается таблица типа: id, id_user, hex, setDate. По истечению какого либо срока от указанной даты проходит удаление записей. Вопрос такой: кто является инициатором удаления записей?
Либо это админ сайт делает запрос на удаление записей дата которых меньше текущей даты скажем на 14 дней, либо это какой то таймер.
Как этот процесс (удаление записей) автоматизируется?
Спасибо Вам большое! Было бы не плохо, если бы вы выложили урок по созданию странички пользователя с меню состоящих из разделов, например: Изменить профайл, Написать сообщение, Личные сообщения. Что-то напободобее.
>>Как этот процесс (удаление записей) автоматизируется?
можно как раз проверять в момент проверки пользователя по таблице. скоро это буду как раз писать :)
>>Как этот процесс (удаление записей) автоматизируется?
Да Cron-ом как же еще?
Отправить комментарий