У меня есть модель AdminMenu, которая определяет иерархию навигации моей системы администратора. Это одинаково для всех пользователей. Структура кэшируется после каждого сохранения в ней. Когда пользователь входит в систему администратора, я извлекаю данные меню из кэша, а также извлекаю все разрешения, которые были предоставлены пользователю, вошедшему в систему. Я делаю это в одном запросе. Подробности размещены здесь .
Затем я рекурсивно перебираю данные меню, проверяя каждый узел на соответствие разрешениям для этого пользователя, выстраиваю структуру меню и сохраняю ее в сеансе. Эта структура меню содержит только узлы, к которым у авторизованного пользователя есть права доступа, и она генерируется только один раз при входе в систему. Затем эта структура меню отображается с помощью помощника.
Кроме того, разрешения доступны в сеансе, поэтому вы можете проверить, отображать ли ссылки в ваших представлениях или нет, например, Отображать ссылку для удаления сообщения можно только в том случае, если у них есть разрешение на его удаление.