Подскажите пожалуйста (и простите если непонятно написал), к примеру есть CRM у которой разрешения хранятся следующим образом: Есть таблица с группами пользователей, каждая группа хранит набор экшенов (пара контроллер@метод). Групп много, потому что пользователи сами могут создавать группы с разными наборами разрешений. Плюс ко всему система разделена на зоны доступа (с вложенными зонами и т.д.) на данный момент набор правил загружается в сессию пользователя в момент аутентификации, причём для того что-бы этот набор правил сформировался, необходимо выполнить довольно длинный запрос с финтами (правила глобальной группы, запреты локальной группы, идентификаторы зоны доступа и т.д.). Вот собственно вопрос: Вот это вообще правильно, получать разрешения один раз и хранить в сессии или надо каждый раз проверять из БД?
Хочется услышать профи, которые на практике столкнулись с подобной задачей, ведь в случае с сессией страдает безопасность (и размер дискового), а в случае с БД страдает БД, ведь при каждом запросе проверять придётся, и тут либо пилить безопасность сессий, либо оптимизировать запросы, либо какой-то другой путь.
Не надо для этого использовать сессии.
Начните с того, что создайте отдельные модели, которые и будут предоставлять интерфейс получения разрешений для конкретного пользователя, например, что-то типа:
securityManager->can('deletePosts')
И уже потом, если заметите, что база данных узкое место - можно будет внутри этих методов подключить более эффективное кеширование, хоть Redis, хоть Memcache.
Сессии однозначно для этого вам не будут нужны.