Аутентификация и авторизация через форму на 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
Разбор ошибок