Авторизация команд в Axon - PullRequest
       118

Авторизация команд в Axon

1 голос
/ 02 августа 2020

До сих пор я обрабатывал авторизацию в CommandHandlers.

Пример: у меня есть совокупная «Команда», содержащая список менеджеров (AggregateIdentifier от пользователя). Затем все обработчики команд в агрегате группы проверяют, является ли пользователь, выполняющий команду, менеджером группы. UserId вводится как метаданные в CommandHandlerInterceptor на основе SecurityContext.

Меня больше всего беспокоит то, что когда я использую саги, это становится дополнительными накладными расходами для поддержания пользовательского контекста в командах, выдаваемых для разных агрегатов. Кроме того, связь с менеджером может истечь в период выполнения саги и последующих неудачных команд, что приведет к неполному состоянию, которое также необходимо обработать с помощью некоторой функции отката.

Лучше выполнить авторизацию на моем уровне контроллера, чтобы избежать дополнительных накладных расходов, или я должен рассматривать это как более эффективную практику, позволяя моим CommandHandlers решать, действительна ли команда для агрегата?

1 Ответ

5 голосов
/ 03 августа 2020

Авторизация для выполнения определенных операций / команд - это то, что, я бы сказал, не зависит от домена c logi c. Напротив, это скорее форма сквозной заботы, которая нужна вам на протяжении всего приложения. Таким образом, размещение в аннотированного метода @CommandHandler - не идеальное место в моей голове. Однако размещение его рядом имеет большой смысл.

Вы указали, что уже используете CommandHandlerInterceptor для заполнения Spring SecurityContext, поэтому я предполагаю, что вы используете CommandDispatchInterceptor для заполнить MetaData команды информацией при отправке команды. Это действительно отличное использование перехватчика logi c, поэтому я оставлю его на месте. Однако это устанавливает информацию, а не проверяет ее.

С этой целью вы можете создать свой собственный Handler Enhancer , который проверяет метаданные безопасности для команды. Вы даже можете создать специальную аннотацию, которую вы добавите рядом с аннотацией @CommandHandler, которая описывает требуемые роли. Таким образом, метод по-прежнему отображает, какие роли вам нужны для данной команды, но фактическая проверка может быть выполнена в этом Handler Enhancer за вас.

Теперь вернемся к вашему вопросу:

Что лучше выполнить авторизацию на уровне моего контроллера, чтобы избежать дополнительных накладных расходов, или я должен рассматривать это как хорошую практику, позволяя моим CommandHandlers решать, действительна ли команда для агрегата?

Я думаю, что это нормально делать это в совокупности, потенциально делая это чище за счет использования Handler Enhancer. Что касается вашего беспокойства в саге, я думаю, вам следует рассмотреть это отдельно. Сага обрабатывает события, факты того, что что-то произошло. Игнорирование этого факта, потому что кто-то, кто инициировал операции, которые привели к этому факту, не имеет прав, не решает вопроса о том, что это все еще произошло. Добавим, что у вас действительно нет никаких гарантий относительно сроков саги. Возможно, ваша сага имеет дело с историческими событиями, а это означает, что она полностью выходит за рамки. "пользователем системы". Сага - это не то, на что ваши пользователи (у которых есть определенные c роли) будут напрямую влиять; это все косвенно. Сага является внутренней для вашей системы, следовательно, это система, описывающая намерение выполнить операцию.

Это мои два цента на ситуацию, надеюсь, это поможет вам @Vincent!

...