Авторизация

Создадим простую систему авторизации. У нас будет секретная страница secret.php, доступ к которой мы будем предоставлять только для авторизованного пользователя. Система авторизации будет работать на основе сессий.

Для системы авторизации нужно сделать три шага.

  1. Открыть сессию. На всех страницах, где подразумевается работа с сессиями, обязательно нужно запустить сессию функцией session_start()
  2. Зарегистрировать сессионные переменные
  3. Снять регистрацию сессионных переменных при помощи функции unset() и закрыть сессию функцией session_destroy()

Шаг первый

Создадим 3 файла — index.php, contact.php и secret.php. Перейти на страницу secret.php может только человек с нужными правами. Код для всех страниц может быть максимально простым. Достаточно у всех разместить ссылки на другие страницы.

index.php


<h1>Это главная страница</h1>

<p><a href="index.php">Главная</a></p>
<p><a href="contact.php">Контакты</a></p>
<p><a href="secret.php">Посторонним вход воспрещён</a></p>

По такому же принципу создайте две другие страницы.

Шаг второй

Пока мы можем свободно ходить по всем страницам, включая секретную страницу. Чтобы ограничить достук к секретной странице, нужно в самом начале страницы проверять, есть ли нужная нам определённая сессионная переменная. Если такой переменной нет, значит пользователь, запрашивающий эту страницу, не авторизован, тогда мы перенаправим его на страницу авторизации, где ему будет предложено заполнить форму с именем и паролем. Внесём изменения в файле secret.php:


<?php
session_start();

if(!$_SESSION['admin']){
   header("Location: enter.php");
   exit;
}
?>

<h1>Секретная страница</h1>

<p><a href="index.php">Главная</a></p>
<p><a href="contact.php">Контакты</a></p>
<p><a href="secret.php">Посторонним вход воспрещён</a></p>

Сначала мы открыли сессию. Далее проверяем условие: «если в массиве $_SESSION нет элемента admin, то выполним код в фигурных скобках — при помощи функции header() переправим пользователя на страницу enter.php (это страница авторизации, которую нужно создать самостоятельно). После функции header() следует обязательно вызвать функцию exit().

Если же условие не выполнится, то есть в массиве $_SESSION будет элемент admin — это значит, что пользователь уже успешно авторизован и мы показать пользователю запрошенную страницу.

Создадим страницу авторизации enter.php. На этой странице разместим форму для ввода логина и пароля:


<h1>Страница авторизации</h1>

<p><a href="index.php">Главная</a></p>
<p><a href="contact.php">Контакты</a></p>
<p><a href="secret.php">Посторонним вход воспрещён</a></p>

<p>Вход</p>
<form method="post">
 Username: <input type="text" name="user" /><br />
 Password: <input type="password" name="pass" /><br />
 <input type="submit" name="submit" value="Войти" />
</form>

На форме у нас есть поле для ввода логина и поле для пароля, а также кнопка, по нажатию на которую будут отосланы данные из формы методом post. Данные будут обработаны на этой же странице. Теперь мы можем попробовать зайти на секретную страницу. Сейчас мы туда попасть не сможем, а будем оказываться на странице авторизации.

Далее нам нужно написать на странице с формой её обработчик, который будет принимать данные из формы и сравнивать, совпадают ли логин и пароль из формы с теми, которые есть у нас. Добавим новый код в enter.php.

Для начала мы должны открыть сессию. На этой же странице мы будем хранить логин и пароль администратора. Обычно эти данные хранятся в базе данных, но для простого примера обойдёмся простым примером.

Наш логин будет admin и хранить его будем в переменной $admin. Пароль будет «mypass» и он будет храниться в переменной $pass. Но хранить пароли в открытом виде не принято — это противоречит принципам безопасности. Хранить пароль мы будем в зашифрованном виде, а зашифровать его нам поможет функция md5(). Эта функция шифрует строку по специальному алгоритму, и на выходе мы получаем строку из 32 символов (хеш). Если мы зашифруем строку «mypass» (это можно сделать, например, в файле contact.php) то получим a029d0df84eb5549c641e04a9ef389e5.


<?php
    echo md5('mypass');
?>

Внесём изменения в enter.php.


<?php
    session_start();
	
	$admin = 'admin';
	$pass = 'a029d0df84eb5549c641e04a9ef389e5';
?>

<h1>Страница авторизации</h1>

<p><a href="index.php">Главная</a></p>
<p><a href="contact.php">Контакты</a></p>
<p><a href="secret.php">Посторонним вход воспрещён</a></p>

<p>Вход</p>
<form method="post">
 Username: <input type="text" name="user" /><br />
 Password: <input type="password" name="pass" /><br />
 <input type="submit" name="submit" value="Войти" />
</form>

Теперь проверим то, что мы получили из формы с тем, что у нас есть в переменных с логином и паролем. Делать это мы будем по условию — только в том случае, если нажата кнопка формы. У кнопки есть имя («submit»), а данные мы передаём методом post(). Соответственно, мы можем проверить, существует ли элемент submit в массиве $_POST. Если есть — кнопка была нажата, и мы будем выполнять действия по проверке присланных данных, иначе — ничего делать не будем. После объявления логина и пароля пишем условие:


<?php
    session_start();
	
	$admin = 'admin';
	$pass = 'a029d0df84eb5549c641e04a9ef389e5';
	
	if($_POST['submit']){
        if($admin == $_POST['user'] AND $pass == md5($_POST['pass'])){
            $_SESSION['admin'] = $admin;
            header("Location: secret.php");
            exit;
        }
		else echo '<p>Логин или пароль неверны!</p>';
    }
?>

<h1>Страница авторизации</h1>
...

Условие по проверке логина и пароля сделано это при помощи логического оператора AND (его также можно записать таким образом — «&&»).

Если пара логин-пароль совпадает, то мы регистрируем сессионную переменную $_SESSION['admin'] и перенаправляем пользователя на секретную страницу secret.php.

Проверим работу формы. Если мы введём заведомо ложные логин и пароль, то получим сообщение, что «Логин или пароль неверны!». Попробуем теперь ввести правильные данные для входа. Если мы нигде не ошиблись, то после нажатия на кнопку «Войти» мы окажемся на секретной странице.

Мы сейчас авторизованы в системе, но если мы введём в адресной строке адрес страницы авторизации, то спокойно попадём на неё и увидим форму авторизации. Такого быть не должно — форму должен видеть только неавторизованный пользователь. Как мы можем исправить это? На странице secret.php мы проверяли, есть ли метка в сессии. Если её нет — мы переводили пользователя на страницу авторизации. Здесь мы можем сделать то же самое, только наоборот. Мы также проверяем, есть ли метка в сессии. Только теперь мы будем переводить пользователя на секретную страницу, если такая метка есть. Это, в принципе, логично. Если есть метка, значит пользователь уже авторизован, и мы его можем перевести на секретную страницу. На странице enter.php после старта сессии допишем такой код:


session_start();

if($_SESSION['admin']){
    header("Location: secret.php");
    exit;
}
...

Теперь, если авторизованный пользователь попробует ввести в адресной строке имя страницы авторизации enter.php — он будет перенаправлен на секретную страницу. Неавторизованный пользователь же сможет свободно попасть на страницу входа.

Шаг третий

Следующий шаг — это реализация выхода авторизованного пользователя. Для этого добавим на странице secret.php ссылку «Выход». Ссылка будет вести на эту же страницу, только к ней будет добавлен нужный нам параметр:


<p><a href="secret.php?do=logout">Выход</a></p>

Параметр будет передан методом GET. При использовании этого метода данные присоединяются к адресу в адресной строке и отделены от адреса вопросительным знаком. Мы передаём один параметр do со значением logout. При загрузке страницы мы можем проверить значение элемента do из массива $_GET. Если оно будет равно строке logout — мы снимаем с регистрации сессионную переменную $_SESSION['admin'] и заканчиваем сессию. Соответственно, метки в сессии после этого не будет и в следующем блоке, где мы проверяем наличие метки, пользователь будет перенаправлен на страницу авторизации.

Допишем код в secret.php.


session_start();

if($_GET['do'] == 'logout'){
   unset($_SESSION['admin']);
   session_destroy();
}

...

Теперь можно попробовать перейти по ссылке «Выход». После выхода мы окажемся на странице авторизации и увидим форму для авторизации. Попасть теперь на секретную страницу админки мы не сможем, пока не авторизуемся.

И последний штрих. Мы можем ограничивать доступ не только к странице админки, но и к любой другой. Для этого достаточно открыть сессию и проверить наличие метки в ней. Чтобы не копировать на каждую новую страницу эти блоки кода — мы их можем вынести в отдельный файл (auth.php) и затем просто подключать этот файл на страницах, к которым нужно ограничить доступ по паролю. Содержимое файла auth.php будет таким:


<?php
    session_start();

    if($_GET['do'] == 'logout'){
        unset($_SESSION['admin']);
        session_destroy();
    }

    if(!$_SESSION['admin']){
        header("Location: enter.php");
        exit;
    }
?>

Теперь в файле secret.php просто подключаем файл auth.php:


<?php
    require "auth.php";
?>

И на любой странице, к которой мы хотим ограничить доступ, теперь достаточно будет подключить этот файл таким способом.

Примечание: Для серьёзных проектов такая система авторизации мало подходит, поскольку пользователей у нас может быть больше одного и хранить их нужно в БД. Да и шифрование пароля функцией md5() часто также бывает неэффективно, поскольку существуют сервисы с базами хешей.

Реклама