Dla naszej aplikacji CQRS MVC, początkowo zaczęliśmy przechowywać wszystkie informacje związane z użytkownikiem w domenie i, jak ktoś wspomniał, było RegisterUserCommand i UserRegisteredEvent. Po zapisaniu informacji o użytkowniku w domenie, to wydarzenie zostało opublikowane i odebrane po stronie odczytu, które również utworzyło użytkownika i wygenerowało wszystkie skróty haseł itp. Następnie wykonaliśmy autoryzację po stronie odczytu: kontroler wykona wywołać "usługę uwierzytelniania modelu odczytu" w celu uwierzytelnienia.
Później w dół drogi, skończyliśmy całkowicie refaktoryzować to. Okazało się, że potrzebujemy dostępu do informacji związanych z użytkownikiem, aby zbudować zabezpieczenia do autoryzacji naszych poleceń, które wykonaliśmy po stronie przetwarzania poleceń (nasza aplikacja jest rozproszoną aplikacją, która wysyła "ogień i zapomnij" asynchroniczne polecenia do kolejki, z niezależny słuchacz po drugiej stronie). Komponent bezpieczeństwa wymagał wówczas odwołania do naszej domeny, aby uzyskać profil użytkownika, co doprowadziło do kłopotliwych problemów z odniesieniami.
Zdecydowaliśmy się umieścić elementy bezpieczeństwa użytkownika w oddzielnej bazie danych, która uważana jest za bardziej centralny komponent, niż przynależność do domeny lub modelu odczytu. Wciąż przechowujemy informacje związane z profilem użytkownika w domenie i czytamy modele (np. Tytuł stanowiska, adres URL konta Twitter itp.), Ale wszystkie informacje związane z bezpieczeństwem, takie jak hashy, są przechowywane w tej centralnej bazie danych. To jest wtedy dostępne dzięki usłudze, która jest dostępna zarówno dla MVC, jak i dla autoryzatora poleceń.
W rzeczywistości nie musieliśmy niczego zmieniać w interfejsie tego refaktora, ponieważ właśnie nazwaliśmy usługę, aby zarejestrować użytkowników z obsługi komend użytkownika rejestru. Jeśli zamierzasz to zrobić w ten sposób, musisz zachować ostrożność, aby operacje związane z obsługą użytkowników były idempotentne. To jest tak, że możesz dać swoim komendom możliwość ponownej próby bez efektów ubocznych, ponieważ aktualizujesz 2 źródła informacji (ES i bazę danych użytkowników).
Wreszcie można oczywiście użyć dostawców członkostwa dla tego komponentu centralnego, ale z tym może być pitfalls. Skończyło się na tym, że napisaliśmy własne - jest to całkiem proste. Ten artykuł zawiera link do strony this, która jest dobrym przykładem tego, jak ją zaimplementować.
Tak samo, jak w przypadku systemów opartych na komunikatach, AFAIK. Wygląda na to, że mieszasz autoryzację i autoryzację. Co próbujesz zabezpieczyć? –
Nie mieszam ich, pytam o oba, naprawdę :) Wydaje się, że moim głównym problemem jest to, że nie wiem, jak to się robi w systemach opartych na komunikatach;) – tuxbear