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

РЕКЛАМА хостинга Beget, которым я пользуюсь более десяти лет

Изображение баннера

Конец рекламы хостинга Beget, который я всем рекомендую.

Комментарии

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

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

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

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

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

Автор статьи: Андрей Олегович

Похожие статьи
PHP
Массивы
Циклы, ветвления
Дата и время. Часовые пояса
gettype(): определить тип переменной PHP
json_decode
Как получить ширину экрана с помощью PHP
Узнать свой HTTP_USER_AGENT
Классы в PHP 8
substr: обрезать строку
Запросы к REST API на PHP
$_SERVER['REQUEST_URI']: текущая url
Работа с базами данных
Работа с cookies
PHP sessions
Аутентификация и авторизация в PHP 8
Мои скрипты
Разбор ошибок

РЕКЛАМА хостинга Beget, которым я пользуюсь более десяти лет

Изображение баннера

Конец рекламы хостинга Beget, который я всем рекомендую.

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

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

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

@aofeed

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

@aofeedchat

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