Все,
Извините заранее - я не эксперт по 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 имеет значение, но это так. Так что, по крайней мере, моя непосредственная проблема решена.
Большое спасибо всем, кто прокомментировал!
Ура,
Мэтт Стюлер