Попытка понять шаблон дизайна Post / Redirect / Get (реализован на PHP) - PullRequest
4 голосов
/ 07 октября 2010

Все,

Извините заранее - я не эксперт по PHP и не разбираюсь в шаблонах проектирования, поэтому этот вопрос может быть немного базовым ...

В любом случае, яработа над веб-приложением, которое потребует входа в систему.

В моем плане должно быть что-то вроде этого:

index.php: эта страница будет содержать простую форму, позволяющую пользователям вводить имя пользователяи пароль.Форма будет отправлять входные данные в ...

login.php: эта страница будет получать входные данные из index.php и проверять эти учетные данные в базе данных.Если какой-либо из входных данных отсутствует или проверка учетных данных завершается неудачно, сценарий php REDIRECT вернет пользователя к 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 не позволит пользователям получить доступ к этой странице напрямую, без входа в систему.

Моя первая проблема заключается в следующем: эта простая логика терпит неудачу в первый раз - когда достигается level1.php, "isset ($ _ SESSION ['authenticated']" " ВСЕГДА возвращает false, поэтому пользовательвсегда перенаправляется обратно в index.php. Если он вводит те же учетные данные во второй раз, процесс работает как надо.

Короче, по причинам, которые я не понимаю, кажется, что сеанс установленот login.php не найден level1.php - я полагаю, из-за перенаправления. Другими словами, проверка на level1.php, кажется, завершается неудачно до тех пор, пока / или не будет выполнен обход в браузере клиента.

Поскольку каждый сайт, требующий входа в систему, уже решил эту проблему, это не должно быть новым испытанием, и они должны быть очень устоявшимся образцом. Как мне справиться с этим?

Смежный вопрос ... Я видел подобные вопросы, заданные здесь ранее, и большинство ответов обычно включают решение, при котором страницы возвращаются к себе.Это кажется немного странным - в идеале, я бы хотел, чтобы каждая страница PHP выполняла определенную работу:

  • index.php - отображать форму для сбора учетных данных, а затем отправлять их в login.php
  • login.php - оцените учетные данные пользователя, затем направьте их на соответствующую страницу
  • level1.php & level2.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» было NOT 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 имеет значение, но это так. Так что, по крайней мере, моя непосредственная проблема решена.

Большое спасибо всем, кто прокомментировал!


Ура, Мэтт Стюлер

Ответы [ 2 ]

1 голос
/ 07 октября 2010

Post Redirect Get вступает в игру, чтобы остановить повторную отправку пользователем своих данных POST, если они обновляют страницу, на которую они были перенаправлены после отправки формы.Если вы хотите реализовать PRG, вы должны установить код заголовка HTTP на 303, например:

header('Location: level1.php', 303);
0 голосов
/ 07 октября 2010

Если учетные данные действительны, то login.php создает сеанс для установления статуса пользователя, прошедшего проверку подлинности:

Я также снимаю в темноте, но у меня сложилось впечатление, что вы можете что-то вывести перед настройкой сеанса в login.php. Поместите session_start в качестве первой инструкции в каждом файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...