Лекция 5.3 Алгоритмизация и программирование. Авторизация и аутентификация
Авторизация и аутентификация
На данном этапе созданный нами и описанный в лекции 5.2 бэкенд сайта доступен всем, и любой может создавать, редактировать и удалять разделы сайта.
Нам необходимо защитить эту страницу - наш файл cp.php. Сделать так, чтобы в него могли заходить только авторизованные администраторы.
Для этого нам надо создать сервис, позволяющий регистрировать администраторов и сервис, позволяющий проверять валидность администраторов, путём проверки логина и пароля администратора.
Данные администраторов в нашем проекте будут храниться в базе данных backend в таблице admins.
В нашем проекте на данном этапе проектирования предполагается, что сайтом будет управлять один администратор со статусом supervisor.
У такого администратора полные права на управление сайтом и только он может принимать решение создавать ему помощников - других администраторов или нет.
При такой постановке задачи нам потребуется создание одной записи в таблице admins, где будут указаны логин, пароль и статус администратора -супервайзера.
Создание таблицы в базе данных
Начнём, как всегда, с создания таблицы в базе данных.
Здесь в поле status по умолчанию будет храниться единица, которая обозначает статус «супервайзер».
Пароль в базе данных должен храниться в зашифрованном виде. Это необходимо для защиты паролей от посторонних лиц.
В нашем примере для шифрования пароля применим встроенную функцию базы данных MySQL - password(), параметром которой укажем наш секретный пароль. Функция password() зашифрует пароль необратимым шифром.
Внесём в таблицу admins с помощью сервиса phpMyAdmin одну единственную запись:
login = admin;
password=password('12345').
phpMyAdmin сформировал запрос и исполнил его:
В результате у нас появилась в таблице запись:
Как видите пароль зашифровался длинной строкой, расшифровать которую практически невозможно.
Для проверки такого пароля потребуется запрос, который будет сравнивать зашифрованный той же функцией password () введённый пароль с записью, которая хранится в поле password.
Проверим это задав следующий запрос в окне SQL запросов phpMyAdmin:
Результат удался, phpMyAdmin нашел нашу запись с нашим логином и паролем!
Запомним и сохраним этот запрос. Будем в дальнейшем использовать его в нашем сценарии.
Алгоритм защиты страницы cp.php
При входе на страницу cp.php сценарий проверки проверяет наличие глобальной переменной сессии . Эта переменная - массив, в которой хранится логин и пароль:
Если такая переменная существует и хранящиеся в ней данные совпадают с теми. Что хранятся в базе данных, то сценарий допускает проверенного администратора к работе с редактором сайта.
В противном случае, сценарий предлагает пройти авторизацию и показывает форму, в которую нужно ввести правильный логин и пароль.
Данные из формы проверяются на соответствие с теми, что хранятся в базе данных и если это так, то сценарий формирует переменную сессии и отправляет её на проверку к началу алгоритма.
Реализуем задуманный алгоритм
Создаём файл с функциями
Для управления аутентификацией (валидацией) администратора создадим несколько функций и разместим их в отдельном файле fns.php.
Функция проверки валидности админа check_admin()
////Функция проверки валидности админа///// function check_admin() { { $l=$_SESSION['valid_admin']['login']; $pa=$_SESSION['valid_admin']['password']; if($r) { { return false; } else { return true; } } } }
Функция проверяет наличие переменной сессии В этой переменной - глобальном ассоциативном массиве по нашему замыслу хранятся логин и пароль авторизованного администратора. Функция извлекает из переменной сессии логин и пароль и формирует запрос к базе данных на проверку наличия логина и пароля в таблице admins. В случае отсутствия в базе данных совпадающих записей, функция возвращает false, в случае наличия - возвращает true.
Функция проверки правильности ввода логина и пароля check_valid_form
//////функция проверки правильности ввода логина и пароля///////// function check_valid_form($login,$password) { $q="select * from admins where login='$login'and password=password('$password')"; if($r) { { return false; } else { $_SESSION['valid_admin']['login']=$row['login']; $_SESSION['valid_admin']['password']=$password; return true; } } }
Функция принимает два параметра - логин и пароль, формирует запрос к базе данных на проверку наличия логина и пароля в таблице admins. В случае отсутствия в базе данных совпадающих записей, функция возвращает false, в случае наличия - запускает сессию функцией , формирует переменную сессии и записывает в нее логин и пароль. Возвращает true.
Функция отображения формы авторизации
function display_auth_form($action)//быстрое формирование формы авторизации { $html=' '; return $html; }
Функция display_auth_form принимает в качестве параметра ссылку на сценарий-обработчик формы, генерирует html код формы авторизации и записывает его в переменную $html, которую и возвращает.
Создаём сценарий авторизации (файл auth.php)
Вы не авторизованы, попробуйте еще раз'; } } $form.=display_auth_form('?p=1'); ?> Авторизация =$form;?>
Исходя из алгоритма работы, данный сценарий запускается в следующих случаях:
- Отсутствия переменной сессии;
- Несовпадении логина и пароля, записанных в переменной сессии с записями в базе данных;
- Несовпадения введённых в форму авторизации логина и пароля с записями в базе данных.
При первом обращении к сценарию, который обуславливается первым и вторым случаем, формируется html код формы авторизации, вызываемый пользовательской функцией display_auth_form, которой мы, в качестве параметра передаём ссылку на обработчик формы:
Форма выглядит примерно так:=$form;?>
Отправка формы вызывает сценарий обработчика формы:
///обработчик формы///// if($p==1) { $login=$_POST['login']; $password=$_POST['password']; $check=check_valid_form($login,$password); if($check) { } else { $form.='‹h1›Вы не авторизованы, попробуйте еще раз<⁄h1>'; } }
Сценарий принимает данные из глобального массива $_POST и вызывает пользовательскую функцию button>, передавая ей в качестве параметров логин и пароль, полученные из формы.
Если переменная содержит истину, значит введённые логин и пароль совпали с записью в базе данных и функция создала переменную сессии . В этом случае заголовок вызывает файл cp.php для нормальной работы по его назначению.
Если содержит ложь, значит в форму были введены некорректные значения логина и пароля, и обработчик добавляет в переменную сообщение о несостоявшейся авторизации:
После чего вновь вызывается функция display_auth_form и html шаблон отображает сообщение и форму авторизации.
Соединяем всё вместе
Дорабатываем файл cp.php
Добавляем функцию старта сессии и присоединяем файл fns.php в начало сценария:
include'db_include.php'; include 'fns.php'; /////Приём переменных//////////
Добавляем сценарий проверки валидности администратора, размещаем его над сценарием удаления раздела.
/////проверка валидности админа/////// $valid_admin=check_admin(); if(!$valid_admin) { /////Удаление раздела/////////
Сценарий проверки валидности админа вызывает пользовательскую функцию check_admin(), которая возвращает в переменную $valid_admin ложь или истину. Если $valid_admin содержит ложь, заголовок header ('location: auth.php') вызывает файл auth.php и сценарий прекращает выполнение дальнейших сценариев с помощью оператора exit.
Если $valid_admin содержит истину, то ничего не происходит и сценарии файла cp.php работают в обычном режиме по их назначению.
Теперь файловая структура нашего проекта выглядит вот так: