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

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

В базе данных требуется всего одна таблица:
[code]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;[/code]

Первый пользователь должен быть добавлен напрямую в базу, так как редактор работает только для авторизованного пользователя (пароль admin):
[code]INSERT INTO `users` (`ID_USERS`, `US_NAME`, `US_FIO`, `US_PASSMD5`) VALUES
(1, ‘admin’, ‘ADMIN’, ’58d1921b404b7d6e8f5059fb6e720645′);[/code]

Самое главное ограничение, которое такая структура накладывает — одна единственная активная сессия, так как отдельной таблицы для их хранения нет. Это обозначает то, что как только выполнен вход в другом браузере, в предыдущем сессия становится недействительной, ведь храним мы только последнюю (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 — оформляем по своему вкусу.

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

В начале большинства скриптов есть
[code]include_once ‘db.php’;[/code]
Благодаря которому не только происходит подключение базы данных, но и проверка авторизации пользователя и переход к авторизации если он не авторизован. Такая схема предотвращает доступ к данным тех кто не авторизован (естественно это не подойдет тем, у кого есть публичные разделы, доступные всем).
Кроме тех java-скриптов, которые подключаются header.php, каждая страница дополнительно внедряет необходимые именно ей скрипты.
Весь php-код, к которому происходит обращение через POST содержится в файлах *_.php для смыслового разделения кода отображения и изменения данных.
Пример JavaScript, сохранающего некоторую информацию в базу:
[code]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();
}
})
}[/code]
Похожим образом сделаны все функции, посылающие данные через POST. В любом скрипте обработки POST-запроса также естественно происходит проверка авторизации, так как она встроена в сам модуль подключения к БД (db.php) и ее трудно случайно забыть.

Вся магия авторизации происходит в модулях login.php и login_.php. Модуль login.php будучи вызван одним из первых, просто не пропустит выполнение следующих модулей, если не сможет подтвердить авторизацию и занести в $ID_USERS идентификатор пользователя. Для этого он использует $_COOKIE[‘US_SESSION’] и $_COOKIE[‘ID_USERS’], которые ищутся в базе и если находятся $ID_USERS получает значение и продолжается выполнение остальных модулей.
Если же модуль проверки считает что пользователь не авторизован, он выводит форму авторизации и обрывает выполнение запроса. Плюс такого метода, в отличии от перекидывания на страницу авторизации в том, что после автооризации страница просто обновляется и пользователь остается там где и был, продолжая свою работу.
Саму авторизацию выполняет такой кусок кода:
[code]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’, »);
}
}
[/code]
Как легко понять в случае успешного нахождения в базе комбинации логина и пароля, генерируется хэш сессии (на основе некоторых данных и случайных составляющих), который тут же заносится в базу, затирая предыдущую сессию (если она там была), и сохраняя значение US_SESSION в куках браузера пользователя.

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

2 комментария к “Простая авторизация на PHP+MySQL+JavaScript+AJAX”

  1. Макс Дробчак

    Хм красавчик!! спасибо от души очень понравился тоториал для новичка это просто бальзам есть де покопаться и на чем схватиться за необходимые зацепоччки которые обычно пролитают мимо в тонне документации . От души!!!

  2. Блин, чето не могу разобраться. Скачал, поставил к себе в проект в отдельную папку. Подключил БД в db.php и в index php. Протестил, вроде подключение к базе есть. Захожу, ввожу логин пароль и нифига.

Оставьте комментарий

Ваш адрес email не будет опубликован.