Як правильно зробити сесії і авторизацію на php

  • PHP
  • ідентифікація користувачів
  • HTTP Cookie

На прикметі 2 варіанти:
1. Сесія + БД. Встановлюємо час життя сесії тиждень і не парімся. У таблицю sessions БД пишемо session_id, user_id, user_agent, session_expire і звіряємо / оновлюємо їх при кожному запиті, крім AJAX-подібних, хоча і для них можна.

"Random_hash" - це просто випадковий набір букв, який замінює session_id в першому прикладі. Такий собі тимчасовий пароль, имхо безпечніше хешу пароля користувача.
При зміні пароля або по запиту користувача все його сесії видаляються з БД і все куки / сесії стануть недійсними.

Поки що дивлюся в сторону першого варіанту.

Олександр Казакевич. Ви змішуєте в одну купу логирование входів і юзер-агентів і сесію, але навіщо? Сесія непогано працює сама по собі, і при цьому ніхто вам не не заважає писати логи хоч в БД хоч в файли.

Олександр Казакевич. вам про поліморфізм говорять. Класу сесій не варто знати, де в дійсності будуть зберігатися сесії. Для цього потрібно описати інтерфейс зберігання сесії. Клас зберігання (драйвер) повинен реалізовувати цей інтерфейс. У конструкторі класу сесій приймаємо параметр збірний нашим інтерфейсом.

Разом виходить, що ви не залежите від сховища. Можете передати в конструктор класу сесій будь-який драйвер, який реалізує інтерфейс і все буде працювати, без зміни коду.

Тепер про плюси. Сесії в php зберігаються в файлах. Це означає, що коли ви поставите лоад балансер і позаду нього 2+ бекенд сервера, у вас запити від клієнта почнуть приходити то на один сервер, то на інший. Користувач буде від запиту до запиту, то залягання, то разлогінен. Звичайно є рішення, липкі сесії, php начебто налаштовується на зберігання в redis. Але найкраще рішення, це абстрагуватися від механізму зберігання сесій в класі сесій і запропонувати кілька варіантів різного зберігання і користувач вже сам через конфіг зможе в потрібний момент часу поміняти механізм зберігання з одного на інший і навіть написати свій, якщо стандартні не влаштують.

Але новачкові це буде складно зрозуміти. Спочатку потрібно, якусь просту книгу по паттернам прочитати, де розкажуть, що таке композиція, навіщо потрібна і чим вона краща успадкування.

Взагалі PHP як перша мова, не дуже добре, дає багато свободи і тому на ньому так багато раздолбайскій коду. Якби починати зі строго типізованого мови, як Java, то ефективність навчання була б в рази вище, але і поріг входження б теж виріс, але не в рази. Але це в ідеалі, звичайно. Сам я теж з PHP починав.

займаюся веб програмуванням

це дуже легко
на прикладі буду використовувати php
якщо тобі треба щоб користувач не міг увійти в особистий кабінет без певної сесії то можна використовувати
if (! isset ($ _ SESSION [ 'login'])) // це означає що якщо сесії немає то перекидає на будь-який потрібний вам файл
header ( "Location. /index.php"); // тут вказати посилання на цей файл

$ Authdb = new PDO ( 'mysql: host = localhost; dbname = root', "toor", "password");

код mysql таблиці вставляти в файл users.sql і завантажувати на сервер

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00: 00";

/ *! 40101 SET @OLD_CHARACTER_SET_CLIENT = @@ CHARACTER_SET_CLIENT * /;
/ *! 40101 SET @OLD_CHARACTER_SET_RESULTS = @@ CHARACTER_SET_RESULTS * /;
/ *! 40101 SET @OLD_COLLATION_CONNECTION = @@ COLLATION_CONNECTION * /;
/ *! 40101 SET NAMES utf8 * /;

--
-- База даних: `ім'я бази данних`
--

--
-- Структура таблиці `users`
--

CREATE TABLE IF NOT EXISTS `users` (
`Id` int (11) NOT NULL AUTO_INCREMENT,
`Login` varchar (100) COLLATE utf8_unicode_ci NOT NULL,
`Password` varchar (100) COLLATE utf8_unicode_ci NOT NULL,
`Email` varchar (100) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY ( `id`)
) ENGINE = MyISAM DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci;

/ *! 40101 SET CHARACTER_SET_CLIENT = @ OLD_CHARACTER_SET_CLIENT * /;
/ *! 40101 SET CHARACTER_SET_RESULTS = @ OLD_CHARACTER_SET_RESULTS * /;
/ *! 40101 SET COLLATION_CONNECTION = @ OLD_COLLATION_CONNECTION * /;

вообщем все
скрипти впрінцапе можна придбати тут scripts-online

Схожі статті