Как организовать ограничение доступа, token-based авторизацию, csrf-token?
Всем привет. Решил модернизировать свой старый мини-фреймворк, появилось много вопросов относительно реализации некоторых аспектов. У фреймворка модульная система (например, blog, admin, shop), каждый модуль имеет свои контроллеры / модели / виды, которые наследуются от общих.
1) Ограничение доступа. Как лучше всего ограничить доступ к конкретным частям сайта (например, к админ-панели)? Какие есть материалы по этом вещам? Всё, что смог нагуглить, что есть Access Control List, RBAC и некоторые фреймворки используют beforeAction (метод контроллера родителя, который вызывается перед всеми методами дочернего контроллера). Не смог нагуглить конкретных доков по этим паттернам. Общие вещи только. Есть какие-то материалы, может в каких-то книгах есть разбор подобных систем?
2) Авторизация. Многие предлагают делать отдельную таблицу, где хранить сессии (идентификатор пользователя, хэшированый токен) и сверятся с токеном, который находится в куках авторизированных ранее пользователей. Первое, что придумывается, что эта таблица будет раздуваться. Ибо пользователь не всегда будет разлогиниваться с помощью сайта, а может просто почистить историю браузера. Как быть в таком случае с данными в таблице, которые никогда больше не будут актуальны? И ещё, что лучше хранить в токене? Некоторые предлагают id + time + user_agent, некоторые предлагают id + time + salt и ещё много разных комбинаций.
3) CSRF. Авторизованный токен не подходит под защиту от CSRF-атаки, так как доступ к кукам есть везде. На сколько я понимаю, такой тип токена нужно генерировать для каждой формы отправки. Но как его правильно генерировать и потом знать, что этот токен легален? Сгенерировал в форму скрытое значение с salt, которое должно на чём базироваться, чтобы сервер смог убедиться, что токен легален? Ещё есть мысль сделать один токен для всех форм и хранить его в $_SESSION и сверять уже её. Как лучше и правильнее всё же это реализовать?