EVVA zählt zu den führenden Herstellern moderner Sicherheitstechnik und bietet mit Xesar ein leistungsstarkes elektronisches Schließsystem, das speziell auf die komplexen Sicherheitsanforderungen heutiger Unternehmen ausgerichtet ist. Aufbauend auf die flexible MQTT-Schnittstelle von Xesar hat open200 die Webapplikation BRUMM entwickelt.
Die Idee hinter Balanced Rights and User Management over MQTT (kurz BRUMM) ist es, die vielfältigen Möglichkeiten von Xesar mit den individuellen Anforderungen unserer Kunden zu verbinden und so maßgeschneiderte Sicherheitslösungen zu schaffen.
Ein neues zentrales Element in BRUMM stellt dabei das Axon Framework von AxonIQ dar, das durch den Einsatz von Event Sourcing, CQRS und DDD eine flexible, skalierbare Architektur bietet.
Fähigkeiten von BRUMM
Im Folgenden stellen wir die wichtigsten Funktionalitäten vor:
- Keycloak
- Brumm verwendet Keycloak als externen Identitätsmanager und Userstore für die Verwaltung von Benutzern.
- Brumm-Benutzer benötigen keinen Account in Xesar.
- Keycloak unterstützt die Integration in IDM-Tools wie LDAP oder Active Directory und bietet Mehrfaktorauthentifizierung sowie Social Login.
- Rollenverwaltung
- In Keycloak erstellte Rollen werden den Brumm-Benutzern zugeordnet.
- Administratoren können festlegen, welche Xesar-Bereiche für Brumm-Benutzer sichtbar sind.
- Rollen werden automatisch mit Brumm synchronisiert.
- Berechtigungszuweisung
- Ein Administrator kann festlegen, welche Berechtigungen für Brumm-Benutzer mit bestimmten Rollen sichtbar sind, sowohl für Einbauorte als auch für Bereiche.
- Personen aus Xesar laden
- Brumm lädt alle Personen aus Xesar und macht sie für Brumm-Benutzer zugänglich.
- Individualberechtigungen
- Brumm-Benutzer können Personen Individualberechtigungen zuweisen, die je nach Rolle hinzugefügt oder entfernt werden können.
- Maximal drei Individualberechtigungen können zugewiesen werden.
- Bestehende Individualberechtigungen, auf die der Brumm-User keinen Zugriff hat, werden entsprechend angezeigt.
- Zeitprofile für Individualberechtigungen
- Zeitprofile für jede Individualberechtigung können festgelegt und aus Xesar geladen werden.
- Audit Trail
- Aktionen von Brumm-Benutzern werden im Audit Trail protokolliert.
Technologie hinter BRUMM
BRUMM wurde ursprünglich als einfache Webanwendung konzipiert, die im Backend auf Spring Boot und Kotlin setzt und über eine REST-Schnittstelle mit einem Angular-Frontend kommuniziert. Die anfängliche Architektur folgte dabei einem klassischen CRUD-Ansatz (Create, Read, Update, Delete), um mit Controllern und Services die Verwaltung der Zutrittsberechtigungen zu organisieren.
Für die Integration mit dem Xesar-System von EVVA nutzen wir die Open-Source-Bibliothek Xesar-Connect, die den Zugriff auf die MQTT-Schnittstelle von Xesar vereinfacht und eine asynchrone, nicht-blockierende Kommunikation mit dem Schließsystem ermöglicht. Da die Asynchronität von Xesar-Connect gut mit einem reaktiven Stack harmoniert, entschieden wir uns für eine reaktive Architektur in BRUMM und setzten auf WebFlux und R2DBC, um die Systemressourcen optimal auszunutzen und auch bei hoher Auslastung eine performante Datenverarbeitung sicherzustellen.
Angesichts der wachsenden Komplexität unserer Geschäftslogik, neuer Anforderungen und des Bedarfs an einem umfassenden Audit-Trail haben wir uns entschieden, das Axon Framework genauer zu evaluieren und schließlich zu integrieren.
Event Sourcing in BRUMM
Um den neuen Anforderungen gerecht zu werden, setzten wir uns intensiv mit der Event-Driven-Architektur auseinander, insbesondere mit dem Konzept des Event Sourcing. Statt den aktuellen Systemzustand direkt zu speichern, zeichnet Event Sourcing jede Änderung als unveränderliches Ereignis auf. Diese Ereignisse repräsentieren die gesamte Historie des Systems und ermöglichen eine präzise Nachvollziehbarkeit und einfache Wiederherstellung von Zuständen.
Den Übergang in diese Architektur begannen wir mit einer gemeinsamen Event-Modeling-Session, an der Scrum Master, Frontend- und Backend-Teams teilnahmen. Hier wurden vorhandene Features für eine Event-Driven-Umsetzung modelliert, wobei wir systematisch in Events, Commands und Views dachten. Die Aufteilung des Systems in sogenannte „Bounded Contexts“ half uns dabei, komplexe Prozesse in überschaubare Module zu unterteilen und die Business-Logik klar zu strukturieren.
Integration von Axon: Anpassungen für Frontend und Backend
Das Frontend musste überwiegend auf eine eventbasierte Kommunikation umgestellt werden. Anstatt wie bisher bei klassischen CRUD-Operationen den gesamten Zustand an das Backend zu senden, werden nun nur noch Änderungen an das Backend übertragen.
Im Backend haben wir das Axon Framework implementiert. Aufgrund der fehlenden Unterstützung für vollständig reaktive Architekturen in Version 4 des Axon Frameworks war die größte Herausforderung, einige Funktionalitäten wieder auf eine nicht-reaktive Weise umzusetzen, einschließlich des Wechsels von R2DBC zu JPA.
Xesar als externes System und seine Bedeutung in Axon
Da Xesar in unserem System die „Single Source of Truth“ darstellt, war bei der Integration des Axon Frameworks besondere Sorgfalt erforderlich. Änderungen in Xesar können unabhängig von BRUMM vorgenommen werden, was es erschwert, den aktuellen Zustand in den Aggregaten stets abzubilden, da diese Informationen nur durch proaktive Anfragen an Xesar verfügbar sind. Aus diesem Grund werden Xesar-bezogene Aggregate passiv abgebildet und dienen hauptsächlich dazu, bei Commands, die eine Änderung in BRUMM anfordern, die entsprechenden Events weiterzuleiten und notwendige Validierungen in den Command-Handlern durchzuführen.
Zudem betrachten wir Xesar in der Axonwelt als eine Art Datenbank, an die wir entweder Befehle zur Ausführung oder Abfragen senden. Deshalb ist der Großteil unserer Business-Logik sowie Xesar-spezifischen Abfragen und Befehle in unseren Axon Projektionen implementiert. Dort befinden sich Event-Handler, die auf Events hören, die von den zugehörigen Xesar-bezogenen Aggregaten gesendet werden. Diese Event-Handler führen dann den jeweiligen Befehl in Xesar aus. Sollte dieser Vorgang fehlschlagen, wird lediglich ein Fehler-Event an das entsprechende Aggregat zurückgesendet. Abfragen an Xesar werden über die zugehörigen QueryHandler in den Projektionen ausgeführt.
CQRS und Gewährleistung der Datenkonsistenz
CQRS (Command Query Responsibility Segregation) ist ein Architekturansatz, der Lese- und Schreibvorgänge entkoppelt. In unserem Projekt BRUMM haben wir dies umgesetzt, indem wir in unseren Controller-Klassen nahezu ausschließlich mit Queries und Commands arbeiten. Da wir mit Axon ein externes System nutzen und Befehle an Xesar Verzögerungen aufweisen können, ist es wichtig, die Schreiboperationen auf Xesar und die anschließenden Leseoperationen so zu gestalten, dass die Datenkonsistenz gewährleistet bleibt.
Um dies zu erreichen, setzen wir derzeit auf Subscription Queries. Die Subscription Queries von Axon ermöglichen es, dass Leseabfragen solange „abonniert“ bleiben, bis der entsprechende Schreibvorgang, insbesondere in Xesar, abgeschlossen ist. So wird die Datenintegrität zuverlässig gewahrt. Für das Frontend stellen wir ein konsistentes und vollständiges Ergebnis über REST bereit, sodass das Frontend nicht mit dem Axon Framework in Berührung kommt.
Vorteile des Axon Frameworks in BRUMM
- Flexible Skalierbarkeit und schnelle Feature-Entwicklung: Das Axon Framework ermöglicht es, neue Features durch die Einführung neuer Ereignistypen hinzuzufügen, ohne dass bestehende Systemteile in BRUMM geändert werden müssen. Dies minimiert das Risiko, die vorhandene Funktionalität zu beeinträchtigen.
- Effiziente Umsetzung eines Audit Trails: Durch Event Sourcing werden alle Änderungen im System als nachvollziehbare Ereignisse gespeichert. Dies vereinfacht die Verwaltung von Audit Trails und ermöglicht uns, die Historie von Rollenänderungen und Zutrittsberechtigungen transparent darzustellen.
- Optimierte Kommunikation zwischen Scrum-Master und Entwicklungsteam: Durch Event Modeling in der Domänensprache schaffen unsere Scrum-Master und Entwickler eine gemeinsame Sprache, was die Planung und Umsetzung neuer Features effizienter gestaltet.
- Trennung von Lese- und Schreibmodellen (CQRS): Die Implementierung von Commands und Queries ermöglicht eine klare Trennung zwischen Lese- und Schreiboperationen. Dies fördert nicht nur die Wiederverwendbarkeit und Erweiterbarkeit des Codes, sondern ermöglicht auch eine optimierte Performance, da Lese- und Schreibmodelle unabhängig voneinander skaliert werden können.
- Leicht lesbarer Code: Die Verwendung der Domänensprache im Code erhöht die Lesbarkeit und Nachvollziehbarkeit.
- Axon Server als Event Store: Der Axon Server bietet uns eine besonders leistungsfähige Option für die Ereignisverarbeitung und stellt mit der AxonIQ Console hilfreiche Features zur Überwachung der Event-Flows und Projections bereit.
Das Zusammenspiel zwischen Xesar, BRUMM und dem Axon Framework bildet die Grundlage für eine für jegliche Kunden maßgeschneiderte anpassbare Zutrittsverwaltungslösung. Durch diese Architektur können wir neue Funktionen agil entwickeln und auf sich verändernde Kundenbedürfnisse schnell reagieren. Im Folgenden einen kurzen Einblick in unsere Roadmap.
Features in Planung
- Berechtigungsprofile
- Gruppenberechtigungsprofil: Ein vorhandenes Gruppenberechtigungsprofil kann einer Person zugewiesen werden, ohne das Profil selbst zu ändern.
- Persönliches Berechtigungsprofil: Ein leeres persönliches Profil kann für eine Person erstellt und mit Bereichen und Einbauorten gefüllt werden, abhängig von der Rolle des Benutzers.
- Medien zuweisen und entfernen
- Medien aus der Xesar-Anlage können Personen zugewiesen und entfernt werden.
- Beim Entfernen eines Mediums wird das Berechtigungsende gesetzt, wodurch kein weiterer Zutritt möglich ist.
- Zeitprofile und Berechtigungsprofile an Rollen zuweisen
- Ein Administrator kann festlegen, auf welche Zeit- und Berechtigungsprofile Brumm-Benutzer in bestimmten Rollen Zugriff haben.
- Smartphone-Unterstützung
- Smartphones können über Brumm als Medium zugewiesen werden, wobei die Telefonnummer eingetragen und der Registrierungsprozess automatisch gestartet wird.
- Das Smartphone erhält dieselben Berechtigungen wie das physische Medium.
- Verbesserte Unterstützung für Berechtigungsprofile
- Mit Gruppenberechtigungsprofil verknüpfen: Das persönliche Berechtigungsprofil einer Person kann mit einem Gruppenberechtigungsprofil verknüpft werden und übernimmt alle Berechtigungen daraus. Zusätzliche Berechtigungen können individuell vergeben werden, und Änderungen am Gruppenprofil werden auf das persönliche Profil übertragen.