Головна мета цього скрипту — навчальна. Скрипт показує, як можна вирішити завдання авторизованого доступу до певних даних. Крім самої авторизації, реалізовано форми перегляду, додавання, редагування та видалення користувачів. Також дотримано мінімальних заходів безпеки: дані фільтруються, типи перевіряються, паролі не зберігаються й не передаються у відкритому вигляді. Одразу скажу: я знаю, що 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]
Завдяки цьому відбувається не лише підключення бази даних, а й перевірка авторизації користувача та перехід до авторизації, якщо він не авторизований. Така схема запобігає доступу до даних для неавторизованих користувачів (звісно, це не підійде тим, хто має публічні розділи, доступні всім).
Крім JavaScript-скриптів, які підключає 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) {
// правильні логін і пароль
$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)

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