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