В базе данных требуется всего одна таблица:
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;
Первый пользователь должен быть добавлен напрямую в базу, так как редактор работает только для авторизованного пользователя (пароль admin):
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)
Хм красавчик!! спасибо от души очень понравился тоториал для новичка это просто бальзам есть де покопаться и на чем схватиться за необходимые зацепоччки которые обычно пролитают мимо в тонне документации . От души!!!
Блин, чето не могу разобраться. Скачал, поставил к себе в проект в отдельную папку. Подключил БД в db.php и в index php. Протестил, вроде подключение к базе есть. Захожу, ввожу логин пароль и нифига.