Аутентификация и авторизация через форму на PHP

Содержание
Введение
Структура
index.php: HTML форма для ввода пароля
autorizer.php: скрипт для проверки
welcome.php: целевая страница
Похожие статьи

Введение

Аутентификация через форму (Form-based authentication) популярна потому, что можно накрутить свою логику.

Структура

Прямо на этом сайте я создал директорию login а ней следующие файлы:

. ├── authorizer.php ├── check_credentials.php ├── index.php ├── logout.php └── welcome.php

Цель посетителя - страница welcome.php

На этой странице есть текст с приветствием и проверка - залогинился пользователь или нет

<?php session_start(); // проверка логина require_once("check_credentials.php"); check_credentials(); echo' <html> <head> <meta charset="utf-8"> <title>Welcome</title> <link rel="stylesheet" href="assets/css/bootstrap.min.css"> <link rel="stylesheet" type="text/css" href="/.css/ao.css"> </head> <body class="background"> <main class="wrapper"> <div class="text-center"> <h1>Welcome to AndreyOlegovich.ru</h1> <form method="post" action="logout.php"> <button class="btn btn-primary" type="submit" name="login">Logout</button> </form> </div> </main> </body> </html> '; ?>

Проверка осуществляется с помощью функции check_credentials() из файла check_credentials.php

<?php session_start(); function check_credentials() { if ( !isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] !== true ) { header("Location: index.php"); exit; }; } ?>

Если переменная сессии $_SESSION["loggedin"] не равна true пользователь отправляется на страницу с логином.

HTML форма для ввода логина и пароля будет находится в файле index.php

vi index.php

<?php session_start(); if (isset($_SESSION["loggedin"]) && $_SESSION["loggedin"] === true) { if (isset($_SESSION["entry_location"])) { $location_header = "location: ".$_SESSION["entry_location"]; header($location_header); } else { header("location: index.php"); } exit; } $username = ""; $password = ""; if (isset($_POST['username']) && isset($_POST['password'])) { if (!empty($_POST['username']) && !empty($_POST['password'])) { $username = $_POST['username']; $password = $_POST['password']; } } echo' <!DOCTYPE html> <html lang="ru"> <head> <meta charset="utf-8"> <title>Login to AndreyOlegovich.ru</title> <link rel="stylesheet" href="assets/css/bootstrap.min.css"> <link href="assets/css/styles.css" rel="stylesheet" type="text/css" /> </head> <body class="background"> <div class="container col-md-8"> <div class="navbar-area text-center"> <a class="page-scroll" href="index.php">HOME</a> </div> <div class="text-center"> <h3 class="title">Введите ваши имя пользователя и пароль</h3> <form method="post" action="authorizer.php"> <div class="row"> <label for="username" class="col-sm-3">Username:</label> <input type="text" name="username" class="col-sm-6" /> </div> <div class="row"> <label for="password" class="col-sm-3">Password:</label> <input type="password" name="password" class="col-sm-6" /> </div> <button class="btn btn-primary" type="submit" name="login">Login</button> </form> </div> </div> </body> </html> '; ?>

Скрипт, который будет проверять введённые данные с правильными сохраните в файл authorizer.php

vi authorizer.php

<?php session_start(); // задайте правильный пароль и имя пользователя $CORRECT_PWD = "PASSWORD"; $CORRECT_USR = "USER"; if (isset($_SESSION["loggedin"]) && $_SESSION["loggedin"] === true) { if (isset($_SESSION["entry_location"])) { $location = $_SESSION['entry_location']; header("location: $location"); exit(); } header("location: welcome.php"); exit(); } if (isset($_POST['username']) && isset($_POST['password'])) { if (!empty($_POST['username']) && !empty($_POST['password'])) { $username = $_POST['username']; $password = $_POST['password']; } } if ($username != "" && $password != "") { if ($username == $CORRECT_USR && $password == $CORRECT_PWD) { $_SESSION["loggedin"] = true; $_SESSION['username'] = $username; header("location: welcome.php"); } else { header("location: login.php"); } } ?>

<?php session_start(); if ( !isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] !== true ) { header("Location: login.php"); exit; }; echo' <html> <head> <meta charset="utf-8"> <title>Welcome</title> <link rel="stylesheet" href="assets/css/bootstrap.min.css"> <link rel="stylesheet" type="text/css" href="/.css/ao.css"> </head> <body class="background"> <main class="wrapper"> <div class="text-center"> <a href="index.php">menu</a> </div> <div class="text-center"> <h1>Welcome to eth1.ru</h1> <form method="post" action="logout.php"> <button class="btn btn-primary" type="submit" name="login">Logout</button> </form> </div> </main> </body> </html> '; ?>

Комментарии

Для простоты был рассмотрен вариант без применения баз данных

Я видел много инструкций где скрипт отвечающий за проверку данных находится в одном файле с HTML формой.

Также я видел вопросы на форумах в стиле «почему нужно нажимать на кнопку логин два раза»

Чтобы избавить себя от возможных проблем - скрипт и форму я держу в разных файлах.

Другие статьи
Блокировка PHP сессий
Установка PHP-фреймворков
Установка Yii
Установка Symfony
Установка Laravel
XDebug - дебаг и профилирование кода php (profiling)

Похожие статьи
Программирование на PHP
Массивы в PHP
Циклы в PHP
Дата и время в PHP - основы
Как отобразить время различных часовых поясов PHP
Как вставить переменную в ссылку PHP
gettype(): определить тип переменной PHP
json_decode
Как получить ширину экрана с помощью PHP
Вызов функции из другого файла
Premature end of chunk coded message body: closing chunk expected
Сгенерировать неповторяющиеся случайные числа PHP
Узнать свой HTTP_USER_AGENT
Сравнить две даты
Классы в PHP 8
Комментарии в PHP
substr: обрезать строку
Запросы к REST API на PHP
$_SERVER['REQUEST_URI']: текущая url
Работа с базами данных
Работа с cookies
PHP sessions
Аутентификация и авторизация в PHP 8
Тернарный оператор
try catch
PHP_errors.log Beget
Разбор ошибок
Изображение баннера

Поиск по сайту

Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых

Перейти на канал

@aofeed

Задать вопрос в Телеграм-группе

@aofeedchat

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящую по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: