Авторизация для выполнения определенных операций / команд - это то, что, я бы сказал, не является логикой, зависящей от предметной области. Напротив, это скорее форма сквозной заботы, которая нужна вам на протяжении всего вашего приложения. Таким образом, размещение его в @CommandHandler
аннотированном методе - не лучшее место в моей голове. Тем не менее, размещение его рядом имеет большой смысл.
Вы указали, что уже используете CommandHandlerInterceptor
для заполнения Spring SecurityContext
, поэтому я предполагаю, что вы используете CommandDispatchInterceptor
для заполнения MetaData
команды информацией при отправке команды. Это действительно отличное использование логики перехватчика, поэтому я бы оставил это на месте. Однако это устанавливает информацию, но не проверяет ее.
С этой целью вы можете создать свой собственный Handler Enhancer, который проверяет метаданные безопасности команды. Вы даже можете создать специальную аннотацию, которую вы добавите рядом с аннотацией @CommandHandler
, которая описывает необходимые роли. Таким образом, метод по-прежнему отображает, какие роли вам нужны для данной команды, но фактическая проверка может быть выполнена за вас в этом Handler Enhancer.
А теперь вернемся к вашему вопросу:
Лучше выполнить авторизацию на уровне моего контроллера, чтобы избежать дополнительных накладных расходов, или я должен рассматривать это как более эффективную практику, позволяя моим CommandHandlers решать, действительна ли команда для агрегата?
Я думаю, что это нормально делать это в совокупности, потенциально делая его чище за счет использования Handler Enhancer. Что касается вашего беспокойства в саге, я думаю, вам следует рассмотреть это отдельно. Сага обрабатывает события, факты того, что что-то произошло. Игнорирование этого факта, потому что кто-то, кто инициировал операции, которые привели к этому факту, не имеет прав, не решает того факта, что это все еще произошло. Добавим, что у вас действительно нет никаких гарантий относительно времени выхода саги. Может быть, ваша сага связана с историческими событиями, а это значит, что она полностью выходит за рамки.
Если это возможно в вашей системе, я бы рассмотрел любую команду, которую Saga хочет опубликовать, как отправленную системным пользователем. Сага - это не то, на что ваши пользователи (у которых есть определенные роли) будут напрямую влиять; это все косвенно. Сага является внутренней по отношению к вашей системе, следовательно, это система, описывающая намерение выполнить операцию.
Это мои два цента к ситуации, надеюсь, это поможет вам @Vincent!
person
Steven
schedule
03.08.2020