flapflapjack
@flapflapjack
на треть я прав

Куда разместить проверку доступа прав юзера?

Модель, вьююуу. контролллер. Даа....

Заметил, что меня часто начинает тормозить такая вот задача:
Есть таблица в бд с правами пользователя , которая повествует нам, что мол "юзер1 имеет доступ к действию а юзер 2 имеет доступ к и ". В общем у каждого свои права.

При рисовании ссылки в View'e мне сейчас пришлось сунуть функцию из Model в View, которая:
1) смотрит на юзера из сессии
2) ищет его права
3) смотрит на ссылку которая сейчас рисуется
4) делает вывод рисовать её или нет, в зависимости от прав

Получается что View имеет доступ к Model, что нарушает православие MVC насколько я помню.


Можно сразу весь массив ссылок готовить для юзера в контроллере. Но вы представляете? На всей странице куча ссылок. Одни ссылки в одной логической части страницы, другие в другой. Там такое нагромождение кода получится! Ужас. Метод в контроллере будет занимать 100500 строк. Так что удобней перед рисование каждой ссылки в View делать проверку.

Для каждого типа юзера делать свой шаблон с уже нарисованными ссылками не получится, ибо права раздаются как в 1С - галочками. Что могу а что не могу.

Как вы делаете?

Вот моя система доступа в абстракции:

class Model {

    
    public function getUser()
    {
        return $this->user;
    }
    
    public function getUserRights($user) {
        return array("edit_news","delete_page");
    }
}

class View {
    private function is_access($level)
    {
        $user=$_SESSION['id'];
        $model=new Model();
        return in_array($level,$model->getUserRights($user));
    }
    
    function render($template,$data);
}


class Controller {
    public function action_news()
    {
        $this->model= new Model();
        $this->view=new View();
        $this->data['text']=$this->model->get_text_of_news();
        $this->view->render("text.html",$this->data);
        
    }
}


text.html :
<?
if($this->is_access('edit_news')) echo "<a href=\"edit.php\">Редактировать новость</a>";
?>


Это вообще нормально?
  • Вопрос задан
  • 116 просмотров
Решения вопроса 1
@Arik
А что мешает вью передать модель пользователя у которого есть массив прав? Дальше просто спрашиваете if($this->user->can('edit-post')) {// рисуем ссылку};
Чтоб запретить доступ на страницу редактирования, то сегодня популярно юзать middleware
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Minifets
@Minifets
Hello world!!!
Можно сразу весь массив ссылок готовить для юзера в контроллере. Но вы представляете? На всей странице куча ссылок. Одни ссылки в одной логической части страницы, другие в другой. Там такое нагромождение кода получится! Ужас. Метод в контроллере будет занимать 100500 строк. Так что удобней перед рисование каждой ссылки в View делать проверку.


Логика построения меню выноситься в отдельный сервис. Для отдельного меню - отдельный билдер. В билдере и чекают права и какие ссылки должны выводиться. Во View отдается уже результат билдера на рендер меню, либо во view через helper получаете нужный билдер и выводите его.
Ответ написан
Ваш ответ на вопрос

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

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