Фон
У меня есть бэк-офис, который управляет информацией из разных источников. Часть информации находится в базе данных, к которой может обращаться бэк-офис, а часть управляется с помощью доступа к веб-службам. Такие службы обычно предоставляют операции CRUD плюс постраничный поиск.
Существует система контроля доступа, которая определяет, какие действия пользователю разрешено выполнять. Решение о том, может ли пользователь выполнить какое-либо действие, определяется правилами авторизации, которые зависят от базовой модели данных. Например. есть правило, которое позволяет пользователю редактировать ресурс, если он является владельцем этого ресурса, где владелец является столбцом в таблице ресурсов. Существуют и другие правила, такие как «пользователь может редактировать ресурс, если этот ресурс принадлежит организации, а пользователь является членом этой организации».
Этот подход хорошо работает, когда модель предметной области непосредственно доступна для системы контроля доступа. Его главное преимущество заключается в том, что он избегает репликации информации, которая уже присутствует в модели предметной области.
Когда данные для манипулирования поступают из веб-службы, такой подход начинает вызывать проблемы. Я вижу различные подходы, о которых я расскажу ниже.
Реализация контроля доступа в сервисе
Этот подход кажется естественным, потому что в противном случае кто-то может обойти контроль доступа, вызвав службу напрямую. Проблема в том, что бэк-офис не имеет возможности узнать, какие действия доступны пользователю для конкретного объекта . Из-за этого невозможно отключить опции, недоступные пользователю, такие как кнопка «Изменить».
Можно добавить дополнительные операции к службе, чтобы получить авторизованные действия для конкретной сущности, но, похоже, мы будем обрабатывать несколько обязанностей для службы.
Реализация контроля доступа в бэк-офисе
Предполагая, что служба доверяет приложению backoffice, можно решить реализовать контроль доступа в backoffice. Похоже, это решает вопрос о том, какие действия доступны пользователю. Основная проблема с этим подходом заключается в том, что больше невозможно выполнять постраничный поиск , потому что теперь служба будет возвращать все совпадающие сущности вместо совпадающих сущностей, которые пользователь также имеет право просматривать.
Внедрение централизованной службы контроля доступа
Если бы контроль доступа был централизован в одном сервисе, каждый мог бы использовать его для просмотра прав доступа к конкретным объектам. Однако мы бы потеряли способность использовать модель домена для реализации правил контроля доступа . Этот подход также связан с производительностью, поскольку для возврата списков результатов поиска, содержащих только авторизованные результаты, невозможно отфильтровать запрос к базе данных с помощью правил контроля доступа. Необходимо выполнить фильтрацию в памяти после получения всех результатов поиска .
Заключение
Я застрял, потому что ни одно из вышеперечисленных решений не является удовлетворительным. Какие еще подходы можно использовать для решения этой проблемы? Есть ли способы обойти ограничения предложенных мною подходов?