Створення простої системи авторизації

15

Від автора: рано чи пізно кожен веб-розробник стикається із завданням щодо обмеження доступу до якоїсь сторінки/сторінок або каталогу. Це може бути просто секретна сторінка на сайті, адміністративна частина сайту або будь-який інший розділ, доступ до якого ми хочемо обмежити і надавати тільки по паролю. Для цього можна, звичайно, скористатися засобами сервера. Думаю, на будь-якому сучасному хостингу є функція паролирования директорії, де можна створити користувача, призначити йому пароль і, після паролирования директорії, доступ до закритого каталогу буде надано лише після правильного вводу логіна і пароля. Але іноді хочеться написати щось самому, щось швидке, просте, але разом з тим — надійне…

У цьому уроці ми спробуємо написати свою просту систему авторизації. У нас буде секретна сторінка — припустимо, це буде сторінка адміністратора, доступ до якої ми будемо надавати лише для авторизованих користувачів. Наша система авторизації буде заснована на роботі механізму сесій. Перед продовженням цього уроку я рекомендую Вам ознайомитися з одним із своїх попередніх уроків, в якому ми, зокрема, розглядаємо роботу сесій — http://webformyself.com/kak-opredelit-ip-adres-polzovatelya/.

Час ролика: 31:32

Посилання для скачування джерел: Завантажити вихідні коди

Посилання для скачування всього архіву (відео+исходники): Скачати одним архівом. Розмір: 47.7 mb.

Коротко всю роботу з сесіями можна розділити на 3 етапи:

Відкриття сесії. На всіх сторінках, де передбачається робота з сесіями, обов’язково повинен бути здійснений старт сесії функцією session_start().

Реєстрація сесійних змінних.

Разрегистрирование сесійних змінних за допомогою функції unset() і закриття сесії функцією session_destroy().

Крок 1

Отже, для нашої роботи створимо 3 файлу — Головна сторінка index.php), Контакти (contact.php) і Адмінка (admin.php). Звертаю увагу на те, що розширення файлу, до якого ми будемо обмежувати доступ повинно бути .php. Як Ви здогадалися, обмежувати доступ ми будемо до файлу admin.php. Код всіх файлів найпростіший — це своєрідне меню рядок з посиланнями на інші сторінки, і під ним індивідуальний текст кожної сторінки, щоб ми могли відрізняти їх один від одного. Ось, наприклад, код індексного сторінки:

Головна | Контакти | Адмінка

Це головна сторінка

Інші сторінки, як я сказав, відрізняються від неї тільки текстом після тега лінії. Я не став робити повноцінні сторінки з мета-тегами, оскільки наше завдання полягає тільки в обмеженні доступу до якоїсь сторінці.

Крок 2

Поки що ми можемо вільно ходити по всіх сторінок, включаючи сторінку адмінки. Як же ми обмежимо доступ до неї? Який взагалі буде алгоритм? Ми будемо робити наступне: на самому початку сторінки ми будемо перевіряти, чи є потрібна нам мітка у сесії або, простіше кажучи, існує певна сесійний змінна (також можна перевіряти одно значення сесійного змінної значенню). Якщо такої змінної немає, значить користувач, запитувач цю сторінку, не авторизований, а значить ми здійснимо його редирект на сторінку авторизації, де йому буде запропоновано заповнити форму з ім’ям і паролем. Алгоритм простий — реалізуємо його. Переходимо до файлу admin.php відкриваємо в самому верху конструкцію PHP і напишемо такий код:

Тепер Давайте прочитаємо це код. По-перше, ми відкрили сесію, як Ви пам’ятаєте — це обов’язкова умова при роботі з сесіями. Далі, ми створили просте умова, яку можна прочитати так: «якщо в масиві $_SESSION не існує елемента admin — будемо виконувати блок дій, укладений в операторні дужки». А в блоці коду ми за допомогою функції header() виробляємо редирект користувача на сторінку enter.php (це сторінка авторизації). Після функції header() обов’язково завершуємо виконання скрипта за допомогою функції exit(). Якщо ж умова не виконується, тобто, у масиві $_SESSION буде елемент admin — це означає, що користувач вже успішно авторизований, і ми пропустимо блок дії в операторних дужках, тобто, ніякого редіректу відбуватися не буде, і ми покажемо запитану сторінку.

Крок 3

Тепер нам потрібно створити сторінку авторизації — enter.php. Для цього скопіюємо код, наприклад, сторінки contact.php створимо новий файл і вставимо в нього скопійований код. Файл зберігаємо під ім’ям enter.php. Тепер на цій сторінці напишемо простеньку форму для введення логіна і пароля:

Головна | Контакти | Адмінка

Це сторінка авторизації.

Username:
Password:

Тут все просто. У формі 2 поля: поле для введення логіна (йому ми дали ім’я «user») і поле для пароля (з ім’ям «pass»). Також ми створили кнопку (ім’я «submit»), після натискання на яку будуть надіслані дані з форми. Дані надсилаються методом post — це ми вказали в атрибуті method тега form — і будуть оброблені на цій же сторінці. Тепер ми можемо спробувати зайти на сторінку адмінки. Якщо все зроблено без помилок — ми туди потрапити не зможемо, а незмінно будемо чинитися на сторінці авторизації.

Чудово!

Крок 4

Далі нам потрібно написати на сторінці з формою її обробник, який буде приймати дані з форми і порівнювати, чи збігаються логін і пароль форми з тими, які є у нас. Для цього відкриємо вгорі сторінки авторизації конструкцію PHP і почнемо писати код. Для початку ми повинні відкрити сесію — адже саме тут ми будемо створювати мітку в сесії, якщо отримані вірні логін і пароль. На цій сторінці ми будемо зберігати логін і пароль адміністратора. Зазвичай ці дані зберігаються в базі даних (БД), але у нас буде тільки 1 користувач (адміністратор), а тому зберігати його дані для входу в БД не зовсім раціонально. Якщо ж користувачів буде не один, тобто, ми, наприклад, пишемо проект, в якому є реєстрація, то, звичайно ж, без БД в такому випадку обійтися буде складно.

Отже, наш логін «admin» і зберігати ми його будемо в змінній $admin. Пароль буде «mypass» і він буде зберігатися у змінній $pass. Але зберігати паролі у відкритому вигляді не прийнято — це суперечить принципам безпеки. Зберігати пароль ми будемо в зашифрованому вигляді, а зашифрувати його нам допоможе функція md5(). Ця функція шифрує рядок за спеціальним алгоритмом, і на виході ми отримуємо рядок з 32 символів (її називають хеш). Якщо ми зашифруем рядок «mypass» (це можна зробити, наприклад, у файлі contact.php):

то на виході отримаємо рядок «a029d0df84eb5549c641e04a9ef389e5» — це і буде наш зашифрований пароль. Поки що код сторінки авторизації буде таким:

Головна | Контакти | Адмінка

Це сторінка авторизації.

Username:
Password:

Крок 5

Тепер перевіримо те, що ми отримали з форми з тим, що у нас є в змінних з логіном та паролем. Робити це ми будемо за умовою — тільки в тому випадку, якщо натиснута кнопка форми. Як ми можемо це перевірити? У кнопки є ім’я («submit»), а дані ми передаємо методом post. Відповідно, ми можемо просто перевірити, чи існує елемент submit в масиві $_POST. Якщо є кнопка була натиснута, і ми будемо виконувати дії з перевірки надісланих даних, інакше — нічого робити не будемо. Після оголошення логіна і пароля пишемо умова:

if($_POST[‘submit’]){
if($admin == $_POST[‘user’] AND $pass == md5($_POST[‘pass’])){
$_SESSION[‘admin’] = $admin;
header(«Location: admin.php»);
exit;
}else echo ‘

Логін або пароль невірні!

‘;
}

Умова щодо перевірки логіна і пароля ми зробили як би подвійним. Зроблено це за допомогою логічного оператора AND (його також можна записати таким чином — «&&»). Умову можна прочитати так: «якщо змінна $admin дорівнює елементу user в масиві $_POST І змінна $pass дорівнює хешу елемента pass в масиві $_POST) {виконуємо блок дій}else виводимо на екран текст ‘Логін або пароль невірні!’

Якщо ж пара логін-пароль збігається, то ми реєструємо сесійний змінну $_SESSION[‘admin’] і перенаправляємо користувача на сторінку адмін — admin.php.
Спробуємо тепер протестувати те, що ми вже створили. Якщо ми введемо завідомо неправдиві логін і пароль, то отримаємо попередження, що «Логін або пароль невірні!». Тепер спробуємо ввести правильні дані для входу. Якщо ми ніде не помилилися, то після натискання на кнопку «Увійти» ми опинимося на сторінці адмінки.

Відмінно!

Крок 6

Тепер залишилося дописати деякі дрібниці. Наприклад, ми зараз авторизовані в системі, але якщо ми введемо в адресному рядку адресу сторінки авторизації, то спокійно потрапимо на неї і побачимо форму авторизації. Такого бути не повинно — форму повинен бачити тільки неавторизований користувач. Як ми можемо виправити це? Пам’ятаємо, що на сторінці admin.php ми перевіряли, чи є мітка в сесії. Якщо її немає — ми переводили користувача на сторінку авторизації. Тут ми можемо зробити те ж саме, тільки навпаки. Тобто, ми також перевіряємо, чи є мітка в сесії. Тільки тепер ми будемо переводити користувача на сторінку адмін, якщо така позначка є. Це, в принципі, логічно. Якщо є мітка, значить користувач вже авторизований, і ми його можемо перевести на сторінку адмінки. На сторінці enter.php після старту сесії допишемо такий код:

if($_SESSION[‘admin’]){
header(«Location: admin.php»);
exit;
}

Тепер якщо авторизований користувач спробує ввести в адресний рядок ім’я сторінки авторизації — він буде переведений на сторінку адмінки. Не авторизований користувач зможе вільно потрапити на сторінку авторизації.

Крок 7

Наступний момент, який нам потрібно передбачити — це реалізація виходу авторизованого користувача, тобто, припустимо, адміністратор закінчив свою роботу і йому треба вийти, щоб ніхто сторонній не зміг працювати під його обліковим записом. Для цього додамо на сторінці admin.php посилання «Вихід». Посилання буде вести на цю ж сторінку, тільки до неї буде доданий параметр потрібний нам. Параметр додається за допомогою знака:

Вихід

Посилання можна поставити в тому місці, в якому нам потрібно — я поставлю її після тексту сторінки. Щодо параметра — він буде переданий методом GET (згадуємо, що з форми ми передавали дані другим параметром — POST). При використанні цього методу дані приєднуються до адреси в адресному рядку і відокремлені від адреси якраз знаком питання. Ми передаємо один параметр — do — і при цьому надали йому значення «logout». Як тепер ми можемо разавторизовать користувача? Дуже просто — тут нам допоможуть другий і третій етапи при роботі з сесіями. При завантаженні сторінки ми можемо перевірити значення елемента do з масиву $_GET. Якщо воно буде дорівнювати рядку «logout» — ми просто разрегистрируем сесійний змінну $_SESSION[‘admin’] і зруйнуємо сесію. Відповідно, мітки в сесії після цього не буде і в наступному блоці, де ми перевіряємо наявність мітки, користувач буде перенаправлено на сторінку авторизації. Все просто.

Отже, на сторінці admin.php допишемо умова після старту сесії (до перевірки наявності мітки):

if($_GET[‘do’] == ‘logout’){
unset($_SESSION[‘admin’]);
session_destroy();
}

Тепер можна спробувати перейти за посиланням «Вихід». Після виходу ми опинимося на сторінці авторизації і побачимо форму для авторизації. Потрапити тепер на сторінку адмінки ми не зможемо, поки не авторізуємось.

Крок 8

І останній штрих. Ми можемо обмежувати доступ не тільки до сторінки адмінки, але і до будь-якої іншої. Для цього достатньо відкрити сесію і перевірити наявність мітки в ній. Щоб не копіювати на кожну нову сторінку ці блоки коду — ми їх можемо винести в окремий файл (auth.php потім просто підключати цей файл на сторінках, до яких потрібно обмежити доступ по паролю. Вміст файлу auth.php буде таким:

Тепер замість цієї конструкції ми у файлі admin.php просто підключимо файл auth.php:

І на будь-якій сторінці, до якої ми хочемо обмежити доступ, тепер достатньо буде підключити цей файл таким способом.

Висновок

На цьому наш урок завершений, ми виконали поставлену в уроці завдання — написали свою простеньку систему авторизації. Звичайно, як говорилося вище, для серйозних проектів така система авторизації мало підходить, оскільки користувачів у нас може бути більше одного і зберігати їх потрібно в БД. Так і шифрування пароля функцією md5() часто також буває неефективно, оскільки існують сервіси з базами хешів… але для нас головне було зрозуміти принцип побудови системи авторизації, а вона будується саме за таким принципом. Отже, урок закінчено. До нових зустрічей.

Створення простої системи авторизації

E-mail: [email protected]