Ich arbeite an einer kleinen Anwendung, um die Prinzipien des domänengetriebenen Designs zu verstehen. Bei Erfolg könnte dies ein Pilotprojekt für ein größeres Projekt sein. Ich versuche, dem Buch "Implementing Domain-Driven Design" (von Vaughn Vernon) zu folgen und ein ähnliches, einfaches Diskussionsforum zu implementieren. Ich habe mir auch die IDDD-Samples auf Github angesehen. Ich habe einige Schwierigkeiten, die Identität und den Zugang zu meinem Fall zu übernehmen. Lassen Sie mich einige Hintergrundinformationen geben:
- Ich verstehe (hoffentlich) die Gründe für die Trennung von Benutzer- und Berechtigungslogik: Es ist eine unterstützende Domäne und es ist ein anderer begrenzter Kontext.
- In der Kerndomäne gibt es keine Benutzer, nur Autoren, Moderatoren usw. Diese werden erstellt, indem mit einem Dienst auf den Identitäts- und Zugriffskontext zugegriffen und die empfangenen Benutzerobjekte in einen Moderator übersetzt werden.
Domain-Operationen werden mit einer verwandten Rolle als Parameter aufgerufen: zB:
ModeratePost( ..., moderator);
Die Methode des Domänenobjekts überprüft, ob die angegebene Moderatorinstanz nicht null ist (die Moderatorinstanz ist null, wenn der vom Identitäts- und Zugriffskontext angeforderte Benutzer nicht die Moderatorrolle hat).
In einem Fall führt es eine zusätzliche Prüfung durch, bevor ein Beitrag geändert wird:
if (forum.IsModeratedby(moderator))
Meine Fragen sind:
Im letzteren Fall werden die Sicherheitsbedenken nicht erneut in die Kerndomäne integriert. Bisher heißt es in den Büchern: "Wer kann ein Thema veröffentlichen oder unter welchen Bedingungen ist dies zulässig? Ein Forum muss nur wissen, dass ein Autor dies gerade tut."
Die rollenbasierte Implementierung in diesem Buch ist recht einfach: Wenn ein Moderator die Kerndomäne ist, versucht er, die aktuelle Benutzer-ID in eine Moderator-Instanz oder in einen Autor zu konvertieren, wenn dies erforderlich ist. Der Dienst antwortet mit der entsprechenden Instanz oder einer Null, wenn der Benutzer nicht über die erforderliche Rolle verfügt. Ich kann jedoch nicht erkennen, wie ich dies an ein komplexeres Sicherheitsmodell anpassen kann. Unser aktuelles Pilotprojekt hat ein recht komplexes Modell mit Gruppen, ACLs usw.
Sogar mit Regeln, die nicht sehr komplex sind, wie: "Ein Beitrag sollte nur von seinem Besitzer oder einem Redakteur bearbeitet werden", scheint dieser Ansatz zusammenzubrechen, oder zumindest sehe ich nicht die richtige Art, ihn umzusetzen.
Wenn ich den Identitäts- und Zugriffskontext nach einer OwnerOrEditor-Instanz frage, fühle ich mich nicht richtig, und ich würde immer mehr sicherheitsrelevante Klassen in der Kerndomäne finden. Außerdem müsste ich nicht nur die Benutzer-ID, sondern auch den Bezeichner der geschützten Ressource (die ID des Posts, des Forums usw.) an den Sicherheitskontext übergeben, der sich wahrscheinlich nicht um diese Dinge kümmern sollte (stimmt das? )
Wenn Sie die Berechtigungen für die Kerndomäne abrufen und sie in den Methoden der Domänenobjekte oder in den Diensten überprüfen, gelangen Sie zum ersten Punkt: Mischen von Sicherheitsbedenken mit der Domäne.
Ich habe irgendwo gelesen (und bin damit einverstanden), dass diese berechtigungsbezogenen Dinge nicht Teil der Kerndomäne sein sollten, es sei denn, Sicherheit und Berechtigungen sind die Kerndomäne selbst. Rechtfertigt eine einfache Regel wie die oben angegebene, Sicherheit zu einem Teil der Kerndomäne zu machen?
HasPermissionToEdit(userId, resourceId)
aber ich halte es nicht für richtig, die Domänenlogik mit diesen Aufrufen zu kontaminieren. Wahrscheinlich sollte ich diese in den Anwendungsdienstmethoden überprüfen, bevor ich die Domänenlogik aufrufe?
UserService @AccessControlList[inf3rno]
in der Antwort, auf die ich verlinkt habe.