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