Как часть какого уровня должны применяться разрешения в MVC? - PullRequest
2 голосов
/ 16 июля 2009

На каком уровне (Модель, Представление, Контроллер) MVC должна обрабатываться логика разрешений?

Позвольте мне немного прояснить это. Очевидно, что пользовательский интерфейс (представление и контроллер) должен иметь возможность доступа к разрешениям для отображения / скрытия компонентов и для обработки сценария отказа в доступе. Также очевидно, что разрешения должны сохраняться для базы данных на уровне модели.

А как насчет "сложных" правил доступа, подобных этому?
В разрабатываемой мной системе вики / CMS каждый пользователь имеет набор разрешений для каждой страницы (просмотр, редактирование, переименование и т. Д.). Для существующих страниц эти разрешения извлекаются из базы данных. Предполагается, что для новой страницы у пользователя есть все возможные разрешения (при создании / редактировании).

Другим примером будет список страниц:
Текущий пользователь должен видеть только те страницы, на которые у него есть разрешение на просмотр, в списке страниц.

Должен ли контроллер обрабатывать эту логику? Или Контроллер должен отвечать только за вызов метода GetPermissions () (или GetPageList), и вся логика для его заполнения обрабатывается в Модели?

Ответы [ 2 ]

5 голосов
/ 16 июля 2009

Контроль доступа к объектам проблемной области принадлежит модели. Это подходящее место, потому что (1) управление доступом к объектам домена тесно связано с самими объектами, и (2) это единственное место, где вы можете убедиться, что два контроллера не могут использовать разные политики доступа для одних и тех же объектов.

Следующие факторы добавляют некоторую путаницу:

  1. Аутентификация происходит на уровне контроллера
  2. Некоторые инструменты и демонстрационные материалы доступны для простого применения контроля доступа - на уровне контроллера, например это , это или то .

Это все еще принадлежит модели.

1 голос
/ 16 июля 2009

Модель должна иметь информацию о разрешенных / запрещенных разрешениях для вошедшего в систему пользователя. Затем контроллер должен разрешить / заблокировать действия в соответствии с моделью. В то же время, представление должно отображать только ссылки, соответствующие действиям, которые пользователю будет разрешено выполнять. Представление будет знать, рисовать или нет определенную ссылку, запрашивающую модель (еще раз).

Вы должны использовать защитное программирование: если вы не управляете доступом к действию на контроллере, не рисуя ссылку для данного пользователя, все равно позволяет этому пользователю выполнить действие. С другой стороны, рисование ссылки действия, которое завершится сбоем (если только проверка разрешений на контроллере), будет раздражать ваших пользователей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...