Все,
Извините заранее – я не эксперт по PHP или не осведомлен в шаблонах проектирования, поэтому этот вопрос может быть немного базовым …
Во всяком случае, я работаю над веб-приложением, для которого требуется логин.
Мой план состоит в том, чтобы иметь что-то вроде этого:
index.php: эта страница будет содержать простую форму, которая позволяет пользователям вводить имя пользователя и пароль. Форма будет POST ввода для …
login.php: эта страница получит данные от index.php и проверит эти учетные данные в отношении базы данных. Если какой-либо из входов отсутствует или проверка учетных данных не удалась, сценарий php вернет пользователя обратно index.php, используя:
header('Location: http://www.mydomain.com/index.php');
Если учетные данные действительны, то login.php создает сеанс для установления аутентифицированного статуса пользователя:
session_start(); $_SESSION['authenticated'] = true;
Затем он определяет, какой тип доступа пользователь имеет. Если у него есть доступ «уровень 1», сценарий перенаправляет пользователя на level1.php, используя:
header('Location: http://www.mydomain.com/level1.php');
Если у пользователя есть доступ «уровень 2», скрипт перенаправит пользователя на level2.php, используя:
header('Location: http://www.mydomain.com/level2.php');
Наконец, когда достигнуто level1.php или level2.php, первое, что они делают, это проверить сеанс. Если пользователь не аутентифицирован, перенаправляйте его обратно на index.php:
session_start(); if (!isset($_SESSION['authenticated']) { header('Location: http://www.mydomain.com/index.php'); } else { // proceed to display the page }
Наличие этой проверки в level1.php и level2.php не позволит пользователям напрямую обращаться к этой странице, не войдя в систему.
Моя первая проблема заключается в следующем: эта простая логика FAILS в первый раз – когда достигается level1.php, "isset ($ _ SESSION ['authenticated']" ALWAYS возвращает false, поэтому пользователь всегда перенаправляется обратно на index.php. он вводит одни и те же учетные данные во второй раз, этот процесс работает так, как должен.
Короче говоря, по причинам, которые я не понимаю, кажется, что сеанс, установленный login.php, не найден level1.php – я предполагаю из-за перенаправления. Другими словами, проверка на level1.php кажется неудачной до тех пор, пока / если в браузер клиента не будет отправлено туда и обратно.
Поскольку каждый сайт, требующий входа в систему, уже решил эту проблему, это не должно быть новым вызовом, и они должны быть очень устоявшейся для этого. Как мне с этим справиться?
Связанный с этим вопрос … Я видел похожие вопросы, заданные здесь раньше, и большинство ответов обычно включают решение, в котором страницы отправляются обратно самим. Это кажется немного странным – в идеале, я бы хотел, чтобы каждая страница PHP выполняла определенную работу:
Это ошибочная настройка? Если да, то какая из них лучше?
И вообще – если одна страница устанавливает сеанс, то перенаправляет пользователя на другую страницу – есть ли способ, которым вторая страница может прочитать сеанс?
В Википедии есть отличная страница о Post / Redirect / Get:
http://en.wikipedia.org/wiki/Post/Redirect/Get
Но для меня это немного концептуально – я бы хотел, чтобы это объяснялось ссылками на конкретные страницы:
Например, на странице «A» «POST» на странице «B», «страница B» перенаправляет пользователя на «страницу C» и т. Д.
И я не понимаю, как это реализовано с сеансами, если сеансы не распознаются при использовании перенаправления.
Большое спасибо заранее за любые советы и идеи.
[ОБНОВИТЬ]
Благодаря комментарию Мэтта Болла, я уточнил проблему:
login.php установил сеанс и перенаправил пользователя на следующий экран:
session_start(); $_SESSION['authenticated'] = true; header('Location: http://www.mydomain.com/level1.php');
Однако, когда level1.php проверил этот сеанс, «authenticated» не был SET :
session_start(); echo (isset($_SESSION['authenticated']); // returns false
Однако, если я изменил login.php, чтобы заголовок перенаправлялся на RELATIVE url вместо абсолютного:
session_start(); $_SESSION['authenticated'] = true; header('Location: level1.php');
Затем level1.php работает так, как я ожидаю:
session_start(); echo (isset($_SESSION['authenticated']); // now returns true
Я не понимаю, почему относительный URL-адрес имеет значение, но он это делает. Таким образом, по крайней мере моя ближайшая проблема решена.
Большое спасибо всем, кто прокомментировал!
Приветствия, Мэтт Стейлер
Post Redirect Get входит в игру, чтобы пользователь не пересылал свои данные POST, если они обновили страницу, на которую они были перенаправлены после отправки формы. Когда вы хотите реализовать PRG, вы должны установить код заголовка HTTP на 303 следующим образом:
header('Location: level1.php', 303);
Если учетные данные действительны, то login.php создает сеанс для установления аутентифицированного статуса пользователя:
Я тоже снимаюсь в темноте, но у меня создается впечатление, что вы можете вывести что-то до установки сеанса в login.php. Поместите session_start
качестве первой инструкции в каждом файле.