2016-12-15 4 views
6

Ich baue derzeit Microservices basierend auf Java Spring Cloud. Einige Microservices verwenden PostgreSQL und einige von ihnen MongoDB. REST und JMS werden für die Kommunikation verwendet. Der Plan ist, SSO und OAuth2 fürAutorisierung in Microservices - Wie kann man Zugriffssteuerung von Domänenobjekten oder Entitäten über ACL steuern?

-Authentifizierung zu verwenden

Die Herausforderung, die ich bin vor, dass Autorisierung auf Domain-Objekt/Unternehmensebene zu tun hat. Dies bedeutet, dass eine Art ACL (Access Control List) benötigt wird. Die beste Vorgehensweise für diese Art von Architektur ist es, so etwas zu vermeiden und grobkörnige Sicherheit wahrscheinlich auf Anwendungs-/Service-Layer-Ebene in jedem Microservice zu haben, aber leider ist dies nicht möglich.

Meine letzte Idee ist Spring Security ACL zu verwenden und die ACL-Tabellen in gemeinsam genutzten Datenbank zwischen allen Microservice haben. Auf die Datenbank würde nur durch die Spring-Infrastruktur oder über Spring API zugegriffen werden. Das DB-Schema sieht stabil aus und wird sich wahrscheinlich nicht ändern. In diesem Fall würde ich einfach die Regel über das Teilen von db zwischen Microservices brechen.

Ich erwäge verschiedene Arten von verteilten Lösungen, aber sie links:

  • One Micro mit ACL und den Zugriff auf sie Ruhe mit - Das Problem ist zu viele http Anrufe und Leistungseinbußen. Ich hätte Spring Security ACL erweitern db Zugang zu ersetzen, indem Rest
  • ACL in jedem Micro für seine eigenen Einheiten nennt - ganz vernünftig klingt, aber einen Fall vorstellen, einige Lese Modelle von Entitäten zu einigen anderen Microservices oder gleiche Einheit synchronisiert ist, die vorhanden ist in verschiedenen beschränkten Kontexten (verschiedene Microservices). ACLs können wirklich unübersichtlich werden und eine Fehlerquelle darstellen.
  • One Micro mit ACL-Tabellen, die zu anderen Microservice als Lesemodell synchronisiert sind. Das Problem besteht darin, dass die Spring Security ACL für MongoDB nicht unterstützt wird. Ich habe einige benutzerdefinierte Lösungen auf GitHub gesehen und ja es ist machbar. Aber ... wenn ich eine neue Entität erstelle, muss ich einen Eintrag im Microservice erstellen, der ACL besitzt, und dann asynchron synchronisiert als ein Lesemodell zu Microservice, der die Entität besitzt. Es klingt nicht als einfache Lösung
  • Wählen Sie eine URL-basierte Zugriffskontrolle auf API-Gateway. Aber ich müsste Spring Security ACL irgendwie ändern. Das API-Gateway müsste zu viel über andere Dienste wissen. Die Granularität der Zugriffskontrolle ist an die REST-API-Granularität gebunden. Vielleicht kann ich nicht alle Folgen und andere Probleme vorstellen, dass dieser Ansatz
  • Schließlich wird die Lösung mit gemeinsamen db bringen würde, die ich erwähnt ist mein Favorit. Eigentlich war es der erste, den ich disqualifiziert habe, weil es eine "gemeinsame" Datenbank ist. Aber nachdem ich die Möglichkeiten durchgegangen war, schien mir, dass dies der einzige ist, der funktionieren würde. Es gibt eine zusätzliche Komplexität, wenn ich eine Art Caching verwenden möchte, da ein verteilter Cache benötigt wird.

Ich würde wirklich einige Ratschläge und Meinungen nutzen, wie die Architektur zu nähern, weil dies wirklich schwierig ist und eine Menge Dinge können schief gehen.

Vielen Dank,

Lukas

+0

Ich denke über diesen Ansatz auch nach. Ich suche jetzt nach einer Bibliotheks-Webapp, die die ACL-Admin-GUI bereitstellt. Wie geht es dir? Alles von Hand selbst? – Adam

+1

Nun, schließlich habe ich die ACLs verlassen und eine einfache benutzerdefinierte Erweiterung für Spring gemacht, die mir erlaubt hat, ohne Persistenz von Informationen über den Zugriff auf das Objekt fortzufahren. Nach einigen weiteren Diskussionen mit Produktbesitzern haben wir herausgefunden, dass es eine Möglichkeit gibt, sie mit einer "Sicherheitslogik" zu lösen. Aus meiner Sicht ist es immer besser, wenn möglich zu gehen. Eine andere Sache ist, dass Spring Tools zur Auswertung mit ACL anbietet, aber es gibt keine Tools, die Ihnen helfen, den Zustand von ACL-Tabellen zu setzen oder zu aktualisieren –

Antwort

1

Ich habe kein vollständiges und klares Bild Ihrer Zulassungsanforderungen. Ich gehe davon aus, eine Korrelation zwischen authentifizierten Benutzern und Domain-Objekt/Einheit Berechtigungen. auf Ihre Domain-Objekt/Einheit Berechtigungen Attribute entsprechen, und implementieren eine Attribut-basiert Access Control (ABAC) Politik

Eine Möglichkeit zu berücksichtigen ist, Benutzer zu definieren.

Die Attribute werden mit der Identität des Benutzers in Ihrem Repository verknüpft und gespeichert und bei der Authentifizierung abgerufen.

Verwandte Themen