Простая авторизация на PHP+MySQL+JavaScript+AJAX

Главная цель этого скрипта — учебная. Скрипт показывает как можно решить задачу авторизованного доступа к некоторым данным. Кроме самой авторизации реализованы формы просмотра, добавления, редактирования и удаления пользователей. Также соблюдена минимальная безопасность — данные фильтруются, типы проверяются, пароли не хранятся и не передаются в открытом виде. Сразу скажу что знаю что MD5 уже давно перебирается очень быстро, поэтому для продакшена используйте свои, более надежные алгоритмы 😉

В базе данных требуется всего одна таблица:

CREATE TABLE `users` (
`ID_USERS` int(11) NOT NULL,
`US_NAME` varchar(30) NOT NULL,
`US_FIO` varchar(50) NOT NULL,
`US_PASSMD5` varchar(32) NOT NULL,
`US_SESSION` varchar(32) DEFAULT NULL,
`US_INS` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`US_DEL` timestamp NULL DEFAULT NULL
) ;

ALTER TABLE `users`
ADD PRIMARY KEY (`ID_USERS`),
ADD UNIQUE KEY `US_NAME` (`US_NAME`);

ALTER TABLE `users`
MODIFY `ID_USERS` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;COMMIT;

Первый пользователь должен быть добавлен напрямую в базу, так как редактор работает только для авторизованного пользователя:

INSERT INTO `users` (`ID_USERS`, `US_NAME`, `US_FIO`, `US_PASSMD5`) VALUES
(1, 'admin', 'ADMIN', '58d1921b404b7d6e8f5059fb6e720645');

Самое главное ограничение, которое такая структура накладывает — одна единственная активная сессия, так как отдельной таблицы для их хранения нет. Это обозначает то, что как только выполнен вход в другом браузере, в предыдущем сессия становится недействительной, ведь храним мы только последнюю (US_SESSION).

Все php-скрипты разбиты на следующие файлы:

  • db.php — подключение базы данных
  • function.php — вспомогательные функции, которые могут понадобится в разных местах.
  • login.php — проверка на авторизацию, и если пользователь не авторизован, то прерывание доступа к любой информации и показ полей авторизации.
  • login_.php — проверка логина, пароля и авторизация.

Интерфейс реализуется следующими файлами:

  • users.php — список пользователей.
  • user.php — интерфейс просмотра и редактирования данных пользователя.
  • user_.php — обработка редактирования пользователя.

Ну и файлы формирующие страницу:

  • header.php — подключаем css, библиотеку jquery, формируем заголовок и основное меню
  • footer.php — закрываем страницу.
  • main.css — оформляем по своему вкусу.

Важные моменты:

В начале большинства скриптов есть

include_once 'db.php';

Благодаря которому не только происходит подключение базы данных, но и проверка авторизации пользователя и переход к авторизации если он не авторизован. Такая схема предотвращает доступ к данным тех кто не авторизован (естественно это не подойдет тем, у кого есть публичные разделы, доступные всем).
Кроме тех java-скриптов, которые подключаются header.php, каждая страница дополнительно внедряет необходимые именно ей скрипты.
Весь php-код, к которому происходит обращение через POST содержится в файлах *_.php для смыслового разделения кода отображения и изменения данных.
Пример JavaScript, сохранающего некоторую информацию в базу:

function SaveFIO() {
$.ajax({
type: "POST",
data: ({action: "upd", ID_USERS: ID_USERS, US_FIO: $("#US_FIO").text() }),
url: "user_.php",
dataType: "html",
success: function (data) {
$("#FIOButton").hide();
}
})
}

Похожим образом сделаны все функции, посылающие данные через POST. В любом скрипте обработки POST-запроса также естественно происходит проверка авторизации, так как она встроена в сам модуль подключения к БД (db.php) и ее трудно случайно забыть.

Вся магия авторизации происходит в модулях login.php и login_.php. Модуль login.php будучи вызван одним из первых, просто не пропустит выполнение следующих модулей, если не сможет подтвердить авторизацию и занести в $ID_USERS идентификатор пользователя. Для этого он использует $_COOKIE[‘US_SESSION’] и $_COOKIE[‘ID_USERS’], которые ищутся в базе и если находятся $ID_USERS получает значение и продолжается выполнение остальных модулей.
Если же модуль проверки считает что пользователь не авторизован, он выводит форму авторизации и обрывает выполнение запроса. Плюс такого метода, в отличии от перекидывания на страницу авторизации в том, что после автооризации страница просто обновляется и пользователь остается там где и был, продолжая свою работу.
Саму авторизацию выполняет такой кусок кода:

if (isset($_POST['US_NAME'])and isset($_POST['US_PASSMD5'])) {
$stmt = $pdo->prepare("select ID_USERS from USERS where US_NAME=? and US_DEL is null and US_PASSMD5=?");
$stmt->execute(array($_POST['US_NAME'], $_POST['US_PASSMD5']));
$result = $stmt->fetch();
if ($result) {
// valid login and pass
$stmt = $pdo->prepare("update USERS set US_SESSION=? where ID_USERS=?");
$US_SESSION = md5(date('dd-mm-yyyy').rand().$result['ID_USERS'].$_POST['US_NAME'].$_POST['US_PASSMD5']);
$stmt->execute(array($US_SESSION, $result['ID_USERS'] ));

setcookie('US_SESSION', $US_SESSION);
setcookie('ID_USERS', $result['ID_USERS']);
} else {
setcookie('US_SESSION', '');
}
}

Как легко понять в случае успешного нахождения в базе комбинации логина и пароля, генерируется хэш сессии (на основе некоторых данных и случайных составляющих), который тут же заносится в базу, затирая предыдущую сессию (если она там была), и сохраняя значение US_SESSION в куках браузера пользователя.

Скачать этот пример в готовом виде (не забудьте создать БД «DOC» и пользователя admin) — php_auth_sample.rar (5kb)

Запись опубликована в рубрике Без рубрики. Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *