Задать вопрос

В контроллере или модели проверять права доступа?

Имеем роутер и структуру сайта вида url/controller/action
К адресу вида url / user / add (добавить юзера) должны иметь доступ все
К адресу вида url / user / 11 (смотреть юзера) только сам юзер
К адресу вида url / user / del (удалить юзера) только администратор сайта

Если это не фреймворк где реализованы RBAC и прочие фишки а самописная система - где корректнее проверять права доступа к этой странице?
Тут есть 2 уровня проверки - это гость / юзер (видно по сессии), а если юзер то надо в БД сходить что бы узнать его права, значит это должна делать модель (контроллер не должен ходить в БД)?

Привлекает ещё концепция middleware из laravel где что-то можно проверить ещё до того как определён нужный контроллер, но тут не понятно где сохранить результаты проверки запроса посредником, передавать во все создаваемые объекты дальше явно, или класть в сессию?
  • Вопрос задан
  • 554 просмотра
Подписаться 4 Оценить Комментировать
Решения вопроса 3
evnuh
@evnuh
Поиск Гугл помог мне, впусти и ты его в свой дом
Проверять в middleware / pre-controller hook / как это у вас называется. Сохранять юзера в контекст этого запроса, контекст прокидывать во все хуки / middleware / конттроллеры / view
Ответ написан
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Тут есть 2 уровня проверки - это гость / юзер (видно по сессии), а если юзер то надо в БД сходить что бы узнать его права, значит это должна делать модель (контроллер не должен ходить в БД)?

Теоретически, если у вас залогиненный пользователь, в сессии можно хранить некоторую информацию, в частности я храню ACL / RBAC в сессии, (ну и имя там, еще что по мелочи чтобы не бегать в базу), а проверку делаю в конторллере (это потому что у нас мидлваря нету), точнее даже в экшене. В принципе и в конструктор контроллера иногда выношу, если точно знаю что весь контроллер под 1 правилом ходит. Это не бест практис, но иногда сползаю в такой вот гуанокод для скорости разработки мелких сайтиков. На больших проектах так не делаю ).
Ответ написан
Комментировать
pezdatskiy
@pezdatskiy
Предприниматель, по выходным- программист
У меня в самописном движке реализовано так:
Есть таблица user_group, в колонками идут контролллеры и темплейты. Стоками группы пользователей. Скрипт в админке обновляет эту таблицу при написании новых контроллеров и темплейтов. Там же выставляются флаги для конкретных сущностей и пользователей 1/0, есть доступ или нет.
Обращение к таблице происходит в роутере. Если доступа у группы нет, возвращает restricted area.
Переменная User_group лежит в сессии.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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