У меня есть приложение PHP MVC. Бизнес-логика реализована в сервисном слое и доменной модели. У меня вопрос, где я должен осуществлять проверки авторизации? На уровне сервиса? Или модель предметной области?
В обсуждении шаблона уровня обслуживания, http://martinfowler.com/eaaCatalog/serviceLayer.html, Мартин Фаулер предпочитает отделять «логику приложения» от «бизнес-логики». Первый идет в сервисном слое, последний в доменных объектах.
Некоторые из моих правил авторизации являются сложными. Авторизация может зависеть от текущего пользователя, его ролей, состояния многих других несвязанных объектов и т. Д. Они, по-видимому, принадлежат объектам домена или, в некоторых случаях, фабрикам для этих объектов.
Но в других случаях правила довольно просты. Например, «только руководитель может одобрить новую запись на доске объявлений». В этих случаях я испытываю желание проверить авторизацию на уровне сервиса. Это устраняет требования безопасности, и, помещая их в (подделывающий) слушатель сервисного уровня, мой код становится проще для тестирования.
Итак, вопрос в том, стоит ли мне помещать простые проверки авторизации на сервисном уровне, а более сложные — в объектах домена? Или я напрашиваюсь на неприятности, разделив их на два слоя?
Итак, я переместил код аутентификации на уровень обслуживания и обнаружил, что было только несколько случаев, когда мне все еще нужно было делать дополнительные проверки в модели. Для согласованности я мог бы также провести эти проверки на уровне обслуживания за счет производительности, но пока я не чувствовал в этом необходимости.
Других решений пока нет …