Pracuję nad małą aplikacją, próbując zrozumieć zasady projektowania opartego na domenie. Jeśli się powiedzie, może to być projekt pilotażowy dla większego projektu. Staram się podążać za książką „Implementing Domain-Driven Design” (autor: Vaughn Vernon) i próbuję wdrożyć podobne, proste forum dyskusyjne. Sprawdziłem również próbki IDDD na github. Mam pewne trudności z przyjęciem Tożsamości i dostępu do mojej sprawy. Pozwól, że podam kilka podstawowych informacji:
- (Mam nadzieję) rozumiem uzasadnienie oddzielenia logiki użytkowników i uprawnień: jest to domena wspierająca i inny kontekst ograniczony.
- W domenie podstawowej nie ma użytkowników, tylko autorzy, moderatorzy itp. Są oni tworzeni, docierając do kontekstu tożsamości i dostępu za pomocą usługi, a następnie tłumacząc otrzymane obiekty użytkownika na i moderatora.
Operacje w domenie są wywoływane z powiązaną rolą jako parametrem: np .:
ModeratePost( ..., moderator);
Metoda obiektu domeny sprawdza, czy dana instancja Moderator nie ma wartości Null (instancja Moderator będzie pusta, jeśli użytkownik zapytany z kontekstu Tożsamość i Dostęp nie ma roli Moderator).
W jednym przypadku dokonuje dodatkowej kontroli przed zmianą posta:
if (forum.IsModeratedby(moderator))
Moje pytania to:
W tym drugim przypadku obawy dotyczące bezpieczeństwa nie są ponownie mieszane w domenie podstawowej? Wcześniej książki stwierdzają „z kim można opublikować temat lub na jakich warunkach jest to dozwolone. Forum musi tylko wiedzieć, że autor robi to teraz”.
Implementacja oparta na rolach w książce jest dość prosta: gdy Moderator jest domeną podstawową, próbuje przekonwertować bieżącego ID użytkownika na instancję Moderatora lub Autor, gdy tego potrzebuje. Usługa odpowie odpowiednią instancją lub wartością null, jeśli użytkownik nie ma wymaganej roli. Nie widzę jednak, jak mogę dostosować to do bardziej złożonego modelu bezpieczeństwa; nasz obecny projekt, dla którego pilotuję, ma dość złożony model z grupami, listami kontroli dostępu itp.
Nawet w przypadku reguł, które nie są zbyt skomplikowane, takich jak: „Post powinien być edytowany tylko przez jego właściciela lub redaktora”, to podejście wydaje się załamać, a przynajmniej nie widzę właściwego sposobu na jego wdrożenie.
Pytanie o kontekst Tożsamość i dostęp do instancji OwnerOrEditor nie wydaje się właściwe, a ja kończyłbym coraz większą liczbą klas związanych z bezpieczeństwem w domenie podstawowej. Ponadto musiałbym przekazać nie tylko identyfikator użytkownika, ale identyfikator chronionego zasobu (identyfikator wpisu, forum itp.) Do kontekstu bezpieczeństwa, który prawdopodobnie nie powinien dbać o te rzeczy (czy to prawda? )
Wyciągając uprawnienia do podstawowej domeny i sprawdzając je w metodach obiektów domeny lub w usługach, skończyłem na pierwszym: mieszanie problemów związanych z bezpieczeństwem z domeną.
Czytałem gdzieś (i zgadzam się z tym), że te rzeczy związane z uprawnieniami nie powinny być częścią domeny podstawowej, chyba że bezpieczeństwo i uprawnienia są samą domeną rdzeniową. Czy prosta reguła, taka jak podana powyżej, uzasadnia uczynienie bezpieczeństwa częścią podstawowej domeny?
HasPermissionToEdit(userId, resourceId)
ale nie czuję się dobrze, aby zanieczyszczać logikę domeny tymi wywołaniami. Prawdopodobnie powinienem je sprawdzić w metodach obsługi aplikacji przed wywołaniem logiki domeny?
UserService @AccessControlList[inf3rno]
w odpowiedzi, z którą się łączyłem.