Wir versuchen herauszufinden, wie Benutzer in einer Microservice-Architektur am besten autorisiert werden können, während sichergestellt wird, dass Microservices nur über eingeschränkte Berechtigungen verfügen. Unsere Architektur verwendet einen zentralen Berechtigungsservice für die Ausgabe von JWT-Token.
Wir haben folgende Anforderungen:
Benutzer sollten auf die Ausführung bestimmter Rollen beschränkt sein. Zum Beispiel sollte ein Benutzer nur in der Lage sein, Inhalte zu erstellen, zu ändern oder zu lesen, die er besitzt.
Microservices sollten nur auf die erforderlichen Berechtigungen beschränkt werden. Beispielsweise sollte es einem Mikrodienst, der nur Daten von einem anderen Dienst lesen muss, ausdrücklich untersagt sein, Daten in diesen Dienst zu schreiben.
Angenommen, wir haben ein System, mit dem Benutzer Bilder zu einem Image Store-Dienst hochladen können. Wir haben einen Tagging-Service, der Bilder automatisch mit einem Ort markiert. Benutzer können nur ihre eigenen Bilder CRUD. Der Markierungsdienst kann jedes Bild aus dem Bildspeicherdienst lesen, sollte jedoch nicht in der Lage sein, Änderungen / Löschungen vorzunehmen.
Was ist ein guter Weg, um dies mit JWT-Token zu erreichen? Einige Lösungen, die wir besprochen haben, sind:
Der Image Store-Dienst stellt zwei APIs zur Verfügung, eine, die extern verfügbar ist (Zugriff auf Benutzer-CRUD) und eine, die intern verfügbar ist (schreibgeschützten internen Zugriff). Scheint unflexibel - was ist, wenn ein anderer interner Dienst Lese- / Schreibzugriff auf alle Bilder benötigt (z. B. eines, das explizite Bilder automatisch löscht)?
Wir haben zwei Berechtigungen im JWT des Benutzers eingerichtet, eine ist CRUD_OwnImages, die andere ist READ_ForAnalysis. Der Markierungsdienst kann feststellen, ob der Benutzer über die Berechtigung READ_ForAnalysis verfügt, und in diesem Fall die entsprechende Anforderung stellen. Wir haben einen weiteren Microservice, der prüft, ob der Benutzer CRUD_OwnImages für CRUD-Operationen an den eigenen Bildern des Benutzers hat. Auf diese Weise ist jeder Mikrodienst verpflichtet, sicherzustellen, dass der Benutzer auf die von ihm gewünschten Aktionen beschränkt ist. Der Abbildspeicher hat bei diesem Ansatz keine Möglichkeit, jeden Mikrodienst einzuschränken, sodass er potenziell unauffällig und fehleranfällig ist.
Wir geben dem Markierungsmikroservice einen eigenen Benutzer mit READ_ForAnalysis als Erlaubnis. Wenn der Markierungsdienst dann Bilder aus dem Bildspeicher anfordert, erhält er Zugriff auf diese, es ist jedoch verboten, sie zu ändern. Der Benutzer des Benutzers hat nur die Berechtigung CRUD_OwnImages, sodass er nur seine Bilder vom Frontend abrufen und darauf zugreifen kann. Wenn ein anderer Dienst CRUD für alle Daten benötigt, können wir ihm CRUD_AllData oder ähnliches geben. Wir mögen diesen Ansatz, da jeder Dienst jetzt für seine eigenen Daten verantwortlich ist (anstatt dass diese Logik über mehrere Dienste hinweg dupliziert wird). Aber was ist, wenn für den Dienst sowohl Benutzer- als auch Microservice-Berechtigungen erforderlich sind? Können wir zwei JWT-Token (sowohl den Benutzer- als auch den Mikrodienst) sicher senden? Gibt es eine Möglichkeit, Berechtigungen sicher zu kombinieren und diese zu senden? z.B
Das Problem wird verschlimmert, wenn die Benutzerinformationen weiter stromabwärts benötigt werden (2 oder 3 Mikrodienste entfernt). Gehen wir nur davon aus, dass es an den einzelnen Mikrodiensten liegt, sich auf die von ihnen benötigten Aktionen zu beschränken und dies nicht explizit zu machen?