2013-01-31 4 views
0

Большие системы используются многими пользователями, поэтому они могут входить в систему, а затем иметь дополнительные разрешения. Разрешения разные, например, разрешение на просмотр подробной информации о других пользователях или разрешениях для выполнения разных действий. Хорошая практика в разработке программного обеспечения - использование шаблонов проектирования. Одним из них является MVC (Model-View-Controller). Итак, мой вопрос: в каком слое модели должны были проверять разрешения? Является ли эта логика приложения проверкой прав пользователя или, возможно, на уровне зрения, некоторые параметры должны быть скрыты/заблокированы/и т.д.?Пользовательское разрешение в шаблоне проектирования MVC

+0

Смотрите этот вопрос в разделе «Разработка программного обеспечения»: https://softwareengineering.stackexchange.com/questions/220574/where-should-user-permission-checks-take-place-in-and-mvc-and-by-who – Flimm

ответ

4

Аутентификация и авторизация не являются частью шаблона проектирования MVC. И это не является прямой обязанностью любого из основных строительных блоков MVC.

Решение, которое вы можете изучить, - это установить контроль доступа в декораторе.

Вы создаете экземпляр Container, в который вы можете вводить объект (это может быть какой-то контроллер, вид или, может быть, сервис из уровня модели) и некоторый диспетчер авторизации. Затем вы вызываете метод на этом контейнере, как если бы это был исходный объект. Если вызов очищается с помощью диспетчера доступа, вы выполняете этот метод. В противном случае вы вызываете исключение.

К сожалению, пример кода в PHP, потому что это мой "родной" язык

$something = new SomeThing; 
$data = $something->getSensitiveData(); // will simply return all the information 

$accessCheck = new AccessManager(.. some dependencies ..); 
$something = new Container($something, $accessCheck); 
try 
{ 
    $data = $something->getSesitiveData(); 
    // will return all information if you pass the authorization. 
} 
catch (AccessDeniedException $e) 
{ 
    // do something 
} 

Этот подход имеет ряд преимуществ:

  1. Управление доступом осуществляется централизованно
  2. Вы можете ввести любой экземпляр в такой контейнер
  3. Не причинит OCP нарушение
  4. Давайте вы отложить добавление авторизации при разработке

«упаковки» в таком декоратора будет происходить, как правило, в пределах завода, который создает экземпляр.

Что касается части триады MVC, вы должны быть обертыванием. Ну ... обычно достаточно обернуть контроллер (особенно при работе с MVC в контексте Web). Но, в зависимости от того, как вы структурируете остальную часть кода, может быть разумным добавить такие проверки авторизации также для служб (группа классов/экземпляров в слое модели).

Дело в том, что этот подход не имеет ограничений по детализации. Вы можете добавить этот тип контроля доступа на любой объект. Даже если у вас нет доступа к исходному коду этого объекта.

Смежные вопросы