Я новичок в PHP. Я попытался реализовать функцию "запомнить меня", как описано ниже.
MysqlSessionHanlder.php → это реализует 6 связанных с сеансом функций, как требуется интерфейсу + все функции для "обычного входа" и логин с функцией "запомнить меня".
login.php → самостоятельно объяснено.
restricted1.php → если Войти успешно, login.php будет перенаправлять на этой странице.
authenticate.php → Эта страница должна быть включена на каждую страницу, которая требует аутентификации перед доступом.
db_connect.php → объясняется сам.
Обычный вход работает хорошо. Я также могу войти в систему, чтобы проверить, что у меня установлен флажок, то есть в обоих случаях я перенаправляюсь на limited1.php. Однако, как только я вхожу в систему, используя функцию "запомнить меня" → закройте браузер → попытайтесь перейти непосредственно к ограничению1.php, меня снова перенаправляют на страницу входа.
Это связано с тем, что limited1.php вызывает first authenticate.php, и этот файл проверяет, является ли пользователь аутентифицированным как обычным, или с помощью автоматического входа в систему существующего cookie.
если нет, это означает, что пользователь пытается получить доступ к закрытой странице без первого входа, который вызывает функцию checkCredentials().
подлинный.php код
require_once __DIR__ . '/db_connect.php';
require_once __DIR__ . '/../../classes/MysqlSessionHandler.php';
$handler = new MysqlSessionHandler($db);
session_set_save_handler($handler);
session_start();
$_SESSION['active'] = time();
if (isset($_SESSION['authenticated']) || isset($_SESSION['auto_login'])) {
// we're OK
} else {
$autologin = new MysqlSessionHandler($db);
$autologin->checkCredentials();
if (!isset($_SESSION['auto_login'])) {
header('Location: login.php');
exit;
}
}
Однако, когда я закрываю Chrome, снова его открываю, а затем пытаюсь получить доступ непосредственно к ограничению1.php, я перенаправляюсь на login.php.
Во время отладки я обнаружил следующее:
Каждый раз, когда пользователь входит в систему с функцией "запомнить меня", функция, которую я написал с именем persistentlogin(), хранит новый токен в БД +, устанавливает куки файл с именем "auto_login", который включает этот токен, используя функцию setCookie().
Я заметил, что имя файла cookie, показанное в супермассивном массиве $ _COOKIE, является PHPSESSID (имя по умолчанию), хотя я установил имя cookie в своем коде как другое ("auto_login"). Я вижу ОБОИХ файлов cookie: PHPSESSID и cookie auto_login в настройках браузера Chrome, но имя файла cookie "auto_login" НЕ отображается в супермассивном массиве $ _COOKIE. Я думаю, что это моя проблема, потому что checkCredentials() пытается получить доступ к "auto_login_cookie" следующим образом:
if (isset ($ _ COOKIE [$this-> cookie])) {
$ cookie - это атрибут, который устанавливается в поле "auto_login".
Почему я не вижу cookie "auto_login", который задается командой setCookie() в массиве $ _COOKIE?
Благодаря,
Qwerty
После нескольких дней отладки (!) Я нашел проблему:
Почему мои файлы cookie не установлены?
Оказывается, я установил путь cookie к чему-то другому, кроме '/', что вызвало эту проблему.
Спасибо, в любом случае :-)
+1 для всех людей, которые вкладывают тяжелую работу и никогда не сдаются, пока не достигнут своей цели!