Створення бази даних
Створимо нову базу даних з назвою testdb. виконавши наступний запит від привілейованого користувача.
Для роботи з базою, додамо окремого користувача testdb і надамо йому необхідні права.
Структура таблиці users
Для зберігання користувачів створимо в базі даних таблицю users. виконавши наступний запит.
- id - унікальний ідентифікатор користувача
- username - логін
- password - шифрований пароль
- salt - сіль для шифрування пароля
Структура файлів і директорій
Створимо директорію «php-auth» для нашого проекту. Додамо в неї такі файли і папки:
Реєстрація користувачів
При реєстрації, користувачеві потрібно ввести логін, пароль і підтвердження пароля. Після відправки форми будемо робити перевірку на існування введеного логіна. Якщо логін вже існує - повідомляємо про це відвідувача.
Вся робота з базою даних буде відбуватися через розширення PDO для PHP. Воно включено в стандартну бібліотеку PHP, починаючи з версії 5.1.
Основна логіка програми знаходиться у файлі classes / Auth.class.php. Розберемо докладніше його вміст.
алгоритм реєстрації
Для створення нового користувача використовується метод User :: create (). який приймає логін і пароль в якості аргументів.
Насамперед, перевіряємо існування користувача. Для цього використовуємо метод User :: getSalt (). який вибирає з бази «сіль» користувача по його логіну. Сіль потрібна для ускладнення підбору паролів користувачів в разі витоку бази.
Якщо користувач існує - викидаємо виняток. Інакше, генеруємо нову сіль і хешіруем їй пароль. Після цього виконуємо запит на додавання даних в базу. Якщо при виконанні запиту відбувається помилка, друкуємо відповідно¿ повідомлення і завершуємо роботу скрипта. Така ситуація може статися при відключенні сервера MySQL або його внутрішньої помилки.
Якщо користувач був усшешно створений, функція User :: create () повертає його унікальний ідентифікатор. Це звичайне числове поле, яке автоматично збільшується при додаванні записів в таблицю.
алгоритм аутентифікації
Для того, щоб перевірити правильність введення логіна і пароля, використовується метод User :: authorize (). Насамперед, ми перевіряємо існування юзера, намагаючись вибрати його сіль з бази. Якщо користувач не знайдений, відразу повертаємо false. Інакше, хешіруем прийнятий пароль цією сіллю через функцію User :: passwordHash (). Потім, робимо вибірку з бази за логіном і хешу пароля.
Якщо результат запиту виявився непустою, то логін і пароль вірні. Зберігаємо пользотельскіе дані в об'єкті класу User. Записуємо id користувача в сесію через метод User :: saveSession (). Якщо в якості першого аргументу - $ remember. передати їй true. то ідентифікатор сесії збережеться в куках. Це дозволить не вводити пароль кожного разу при перезапуску браузера.
Робота з формами через Ajax
Для обробки Ajax-запитів створимо клас AjaxRequest. Збережемо його в файлі classes / AjaxRequest.class.php.
Цей клас полегшить нам обробку даних, відправлених користувачем з форми. Як конструктора, він приймає масив з даними запиту ($ _GET або $ _POST).
Метод getRequestParam () потрібен для отримання параметра із запиту. Він робить додаткову перевірку на існування ключа масиву і повертає null. якщо запит не містить потрібних даних.
Функція setResponse () використовується для формування відповіді. Метод setFieldError () потрібен для передачі повідомлення про помилку в поле форми.
Для того, щоб повернути відповідь користувачеві, ми використовуємо метод showResponse. Він генерує рядок в JSON-форматі, задає потрібні HTTP-заголовки і повертає дані клієнта.
У файлі ajax.php відбувається безпосередня обробка запитів через клас AjaxRequest.
Формат JSON-відповіді
На стороні клієнта, ми повинні мати можливість показати результат операції в зрозумілому для людини вигляді. Для цього ми повертаємо JSON відповідь в такому форматі:
Створимо файл js / ajax-form.js. Він буде перехоплювати подія відправки всіх форм з класом ajax і відправляти асинхронний запит серверу. Вихідний код ajax-form.js.
Для роботи скрипта потрібен jQuery версії 2.0.3 (лежить в архіві з кодами).
Ці коллбекі викликаються тільки, якщо валідація відповіді пройшла успішно. Метод script.ajaxForm.validate перевіряє наявність у відповіді імені поля з помилкою. Якщо таке поле існує, подствечівает його і відображає текст самої помилки.
UPDATE: Виправлені помилки, пов'язані з хешированием пароля, нормально запрацювала функція «Запам'ятати мене». Спасибі користувачеві santas156 за знайдені баги.
Рейтинг - 4.9 Голосів - 27