Ответ 1
После прочтения вопроса о StackOverflow Ive было вдохновлено помочь ему, написав реализацию PHP/MySQL Чарльза Миллерса "Persistent Login Cookie Best Practice". В этом учебнике я предполагаю, что у вас уже есть система PHP с логином пользователя.
CREATE TABLE user_sessions (
user_id INT(11) UNSIGNED NOT NULL,
session VARCHAR(39) NOT NULL,
created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
PRIMARY KEY (user_id, session)
);
Сначала нам нужно обновить сайт, когда вы входите в систему, чтобы сохранить сессию в файле cookie. Этот код будет работать с вашей текущей системой входа.
if (/* Code that verifies credentials */) {
// ... code to log user into session
PersistentAuth::login($userId);
}
Во-вторых, мы хотим проверить, есть ли у нового пользователя на сайте учетные данные cookie. Этот код будет идти в начале вашего кода. Он проверяет, во-первых, мы уже вошли в нашу $_SESSION? если нет, попробуйте войти в систему на основе файлов cookie.
if (/* !loggedIn() */ && ($userId = PersistentAuth::cookieLogin())) {
// ... use $userId to log user into session
}
В-третьих, в соответствии с статьей Чарльза Миллерса мы не можем разрешить пользователю следующие разделы, если они вошли в систему через файл cookie:
- Изменение пароля пользователя
- Изменение адреса электронной почты пользователей (особенно если используется восстановление пароля на основе электронной почты)
- Любой доступ к адресу пользователя, платежным реквизитам или финансовой информации.
- Любая возможность совершить покупку
код:
if (PersistentAuth::isCookieLogin()) {
// User is logged in via cookie and don't have access to this
// section. We need to ask them for the password. Maybe send
// them to some login page?
// TODO ask for password or send to a password page
}
Чтобы получить весь код для проверки статуса PersistentAuth, мой сайт здесь: http://www.chrislondon.co/php-persistent-login/
С этим классом PersistentAuth есть несколько изменений, которые вам нужно будет сделать. Один из них должен изменить функцию getDb(), чтобы вернуть экземпляр вашей базы данных. Я использую PDO в этом примере. Я настроил каждую обновленную страницу, очистив базу данных старых сеансов. Лучший способ справиться с этим - использовать cron. Если вы настроили cron, измените флаг USE_CRON на true в настройках класса