Как правильно сделать сессии и авторизацию на PHP?

Начинающий кодер, прошу сильно не придираться.
PHP 7.0.4 + MySQL 5.7 + PhpStorm 2016.1.2 + XDebug 2.4.0
Захотел написать свою CMS-ку. Сделал каркас, пришло время научить её различать юзеров. Начитался различных тем с подводными камнями и т.д, причем все написаны более 2 лет назад.

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

2. Куки + БД. При успешной авторизации создаем в таблице sessions БД запись user_id, random_hash, user_agent, expire. В куки пишем user_id, random_hash. Время действия куков - неделя, при посещении сверяем и продлеваем куки еще на неделю. По сути то же самое, просто меняем $_SESSION на $_COOKIE.

"random_hash" - это просто случайный набор букв, заменяющий session_id в первом примере. Этакий временный пароль, имхо безопаснее хеша пароля пользователя.
При смене пароля либо по запросу юзера все его сессии удаляются из БД и все куки/сессии станут недействительными.

Пока что смотрю в сторону первого варианта.

И еще, как поступать с неавторизованными юзерами? Так же создавать для них сессии? Всё же права доступа они тоже имеют и их можно сравнить с зарегистрированными.
  • Вопрос задан
  • 13183 просмотра
Решения вопроса 2
ppokrovsky
@ppokrovsky
Оба подхода не очень хорошие, так как смешивают логику аутентификации пользователя с логикой протоколирования событий. Условно у вас есть 3 модели: User, Session и UserLog.
Связь UserLog и Session опосредованная через User. Такой подход позволит вам а) организовать хранение сессий в виде "1 пользователь - 1 кука", б) даже если у пользователя умерла кука и ему выдалась новая, вы сохраняете историю пользователя, тк UserLog привязана к User через внешний ключ.
Ответ написан
Комментировать
@kstyle
посмотрите sentry
или yii2-user
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
safenoob
@safenoob
Зачем вообще сессию в БД хранить?
Авторизовался юзер - старт сессии. Браузер закрыл / открыл / время истекло - ещё раз авторизовался.
Всё равно многие пароли в браузерах сохраняют.
Ответ написан
VGrabko
@VGrabko
Golang, Php, Js
сделайте абстракцию над сессиями который будет использовать драйвер. Драйвера будут реализовать к примеру хранение сессий в редисе и в файловой системе. И потом пользователь сам настроит что хочет.
Ответ написан
Arris
@Arris
Сапиенсы учатся, играя.
Посмотрите в сторону PHPAuth : https://github.com/PHPAuth/PHPAuth
Ответ написан
Комментировать
SerafimArts
@SerafimArts
Senior Notepad Reader
В БД для таблицы юзеров добавляешь, например auth_token, при входе его генерируешь и пишешь в куку. При заходе пользователя с кукой, в которой есть нужный токен - логинишь под нужным юзверем.

Самый простой вариант.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы