Для нашего приложения MVC CQRS мы изначально начали хранить всю информацию, относящуюся к пользователю, в домене, и, как и кто-то упоминал, существовал RegisterUserCommand и UserRegisteredEvent. После сохранения пользовательской информации в домене это событие было опубликовано и поднято на стороне чтения, которое также создало пользователя и сгенерировало все хэши паролей и т. Д. Затем мы выполнили аутентификацию на стороне чтения: контроллер выполнил бы обратиться к «службе проверки подлинности модели» для аутентификации.
Позже, по дороге, мы закончили полностью рефакторинг этого. Оказалось, что нам нужен доступ к информации, относящейся к пользователю, для создания безопасности для авторизации наших команд, которые мы выполнили на стороне обработки команд (наше приложение представляет собой распределенное приложение, которое отправляет асинхронные команды «огонь и забыть» в очередь, с автономный слушатель с другой стороны). Компонент безопасности затем нуждался в ссылке на наш домен, чтобы перейти и получить профиль пользователя, что привело к громоздким вопросам реферирования.
Мы решили поместить материал безопасности пользователя в отдельную базу данных, которую мы считаем более центральным компонентом, а не принадлежим к домену или модели чтения. Мы по-прежнему сохраняем информацию о пользователе в домене и читаем модели (например, название должности, URL-адрес учетной записи Twitter и т. Д.), Но все связанные с безопасностью вещи, такие как хэши паролей, хранятся в этой центральной базе данных. Затем это доступно с помощью службы, доступной как MVC, так и автору команды.
Нам не нужно было ничего менять в пользовательском интерфейсе для этого рефакторинга, так как мы только что вызвали службу для регистрации пользователей из обработчика пользовательских команд регистров. Если вы собираетесь это сделать, вам нужно быть осторожным здесь, чтобы сделать свои действия, связанные с обслуживанием пользователей, идемпотентными. Это значит, что вы можете дать вашим командам возможность повторных действий без побочных эффектов, потому что вы обновляете 2 источника информации (ES и пользовательскую базу данных).
Наконец, вы можете, конечно, использовать поставщиков членства для этого центрального компонента, но с этим может быть pitfalls. Мы закончили тем, что просто писали наши собственные - это довольно просто сделать. Эта статья ссылается на this, что является хорошим примером того, как ее реализовать.
Точно так же вы делаете это в системах на основе сообщений, AFAIK. Кажется, вы смешиваете авторизацию и аутентификацию. Что вы пытаетесь обеспечить? –
Я не смешиваю их, я спрашиваю об обоих, на самом деле :) Кажется, моя главная проблема заключается в том, что я не знаю, как это делается в системах на основе сообщений;) – tuxbear