2009-07-16 5 views
2

В каком слое (Model, View, Controller) MVC должна обрабатываться логика разрешения?Как часть того, какие уровни должны быть применены в MVC?

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

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

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

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

ответ

5

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

следующих факторов добавить некоторую путаницу:

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

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

1

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

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