From 642261d53dbad6c5914046ec61335e849c596e11 Mon Sep 17 00:00:00 2001 From: Julian Horner <julianhorner@web.de> Date: Sat, 11 Jan 2020 16:26:29 +0100 Subject: [PATCH] Update README.md --- README.md | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index abc0e84..9dab0cb 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ # microservices ## Worum geht es in diesem Projekt? -Das Projekt setzt eine einfache Microservices-Architektur um. Enthalten sind ein API-Gateway, ein Service für die Authentifizierung, ein Service-Discovery-Server und ein Service welcher zwei einfache HTML-Dokumente verwaltet. +Das Projekt setzt eine einfache Microservices-Architektur um. Enthalten sind, jeweils in einem eigenen Projekt, ein API-Gateway, ein Service für die Authentifizierung, ein Service-Discovery-Server und ein Service welcher zwei einfache HTML-Dokumente verwaltet. -Der Benutzer kann den API-Gateway standardmäßig über http://localhost:2222/ erreichen. Hier wird eine ungesicherte Seite als Antwort gesendet, welche einen Link zu einer gesichterten Seite enthält. Wenn der Benutzer auf den Link klickt wird eine Seite zurückgeliefert die ein Login-Formular enthält. Hier kann der Benutzer sich authentisieren und wenn er die erforderliche Berechtigung besitzt wird ihm die angeforderte Ressource vom API-Gateway zurückgeliefert. +Der Benutzer kann den API-Gateway standardmäßig über http://localhost:2222/ erreichen. Hier wird eine ungesicherte Seite als Antwort gesendet, welche einen Link zu einer gesichterten Seite enthält. Wenn der Benutzer auf den Link klickt wird eine Seite zurückgeliefert die ein Login-Formular enthält. Hier kann der Benutzer sich authentisieren. Wenn er die erforderliche Berechtigung besitzt wird ihm die angeforderte Ressource vom API-Gateway zurückgeliefert. -Es existieren zwei Benutzer, ein Benutzer mit dem Benutzernamen "Admin" und einer mit dem Namen "Default", dass Passwort beider Benutzer ist "12345". Der Benutzer mit dem Namen "Admin" hat entsprechende Berechtigungen und darf auf die geschützte Ressource zugreifen, der Benutzer mit dem Namen "Default" hingegen hat nur eingeschränkte Berechtigungen und darf nicht auf die Ressource zugreifen. Der Default Nutzer bekommt bei einem Versuch auf die Ressource zuzugreifen eine 403 HTTP Status Response (Forbidden). Diese zeigt dem Benutzer an das die Authentifizierung zwar erfolgreich war, die Autorisierung allerdings fehlgeschlagen ist und er kein Recht hat auf die Ressource zuzugreifen. +Es existieren zwei Benutzer, ein Benutzer mit dem Benutzernamen "Admin" und einer mit dem Namen "Default", dass Passwort beider Benutzer ist "12345". Der Benutzer mit dem Namen "Admin" hat eine Rolle welche dazu berechtigt ist auf die geschützte Ressource zuzugreifen, der Benutzer mit dem Namen "Default" hingegen hat eine Rolle welche nur eingeschränkte Berechtigungen besitzt, daher darf "Default" nicht auf die Ressource zugreifen. Der Default Nutzer bekommt bei einem Versuch auf die Ressource zuzugreifen einen 403 HTTP Response Status Code (Forbidden). Diese zeigt dem Benutzer an das die Authentifizierung zwar erfolgreich war, die Autorisierung allerdings fehlgeschlagen ist und er kein Recht hat auf die Ressource zuzugreifen. ## Details Das Projekt enthält mehrere git submodule von welchen jedes ein eigenständiges git Projekt darstellt. Die Submodule sind: @@ -24,7 +24,7 @@ Das Projekt nutzt einen Serverseitigen-Discovery-Mechanismus, welcher über Der Eureka-Server wird im Projekt eureka-server umgesetzt. Die Services registrieren sich bei diesem als Eureka-Clients und schicken diesem in regelmäßigen Intervallen Aktualisierungen ihres Standorts. Wenn ein Service sich eine bestimmte Zeit lang nicht mehr beim Server meldet wird dieser abgemeldet und aus der Liste der verfügbaren Services entfernt. Da die Services sich selbständig beim Server registrieren können diese auf einfache Art und Weiße gefunden werden. ## api-gateway -Der API-Gateway wird im Projekt api-gateway umgesetzt. Der Client kommuziert ausschließlich mit dem API-Gateway. Je nachdem welchen Pfad der Client anfragt, überprüft der API-Gateway ob die erforderlichen Berechtigungen vorliegen, routet die Anfrage an einen der Services weiter und das resultierende Ergebnis wieder zurück zum Client. Wenn Services untereinander kommunizieren erfolgt diese ebenfalls über den API-Gateway. Der API-Gateway erfragt dafür den Standort der Services beim Eureka-Server. +Der API-Gateway wird im Projekt api-gateway umgesetzt. Der Client kommuziert ausschließlich mit dem API-Gateway. Je nachdem welchen Pfad der Client anfragt, überprüft der API-Gateway ob die erforderlichen Berechtigungen vorliegen, routet die Anfrage an einen der Services weiter und das resultierende Ergebnis wieder zurück zum Client. Wenn Services untereinander kommunizieren erfolgt dies ebenfalls über den API-Gateway. Der API-Gateway erfragt dafür den Standort der Services beim Eureka-Server. Das Routing wird mit zuul umgesetzt. zuul ist der Gateway Service, von Netflix, welcher neben routing weitere Funktionalitäten anbietet, zum Beispiel Ausfallsicherheit, Lastverteilung oder Sicherheitsaspekte. zuul ist ebenfalls im Spring-Cloud-Framework enthalten. @@ -42,7 +42,7 @@ Die letztendliche Autorisierung erfolgt über den Token welchen der Benutzer Der Authentifizierungsservice wird im Projekt authentication-service umgesetzt. Zur durchführung der Authentizierung nutzt das Projekt Thymeleaf, JWT und das Spring-Security-Framwork. -Der authentication-service überprüft ob die vom Benutzer eingegebenen Anmeldedaten korrekt sind. Wenn das der Fall ist erstellt der authentication-service einen Token und signiert diesen mit einer HMAC mit SHA256 und einem entsprechenden Schlüssel. Der Token enthält die Anmeldeinformation des Benutzers und seine Rechte. Der Token wird dem Benutzer über den API-Gateway zugesendet. +Der authentication-service überprüft ob die vom Benutzer eingegebenen Anmeldedaten korrekt sind. Wenn das der Fall ist erstellt der authentication-service einen Token und signiert diesen mit einer HMAC mit SHA256 und einem entsprechenden Schlüssel. Der Token enthält die Anmeldeinformation des Benutzers und seine Rollen. Der Token wird dem Benutzer über den API-Gateway zugesendet. ## dummy-service Der Service welcher die zwei HTML-Dokumente verwaltet wird im Projekt dummy-service umgesetzt. Der dummy-service ist eine einfache Anwendung welche die securedPage.html und die index.html verwaltet. Beide Dokumente enthalten einen Link zur jeweils anderen Seite. @@ -71,17 +71,17 @@ und unter Windows mit... mvnw.cmd spring-boot:run -Nach dem Start der letzten Anwendung kann es vorkommen das manche der Anwendungen noch nicht beim Eureka-Server registriert sind bzw. der API-Gateway eine veraltete Version der Liste der beim Eureka-Server registrierten Server vorliegen hat. Da der API-Gateway in diesem Fall den jeweiligen Service nicht findet wird er eine Weiterleitung verweigern und eine Fehlermeldung auslösen. Ist das der Fall empfiehlt es sich einige Sekunden zu warten bis der API-Gateway sich eine neue Version der Liste der Services besorgt hat. +Nach dem Start der letzten Anwendung kann es vorkommen das manche der Anwendungen noch nicht beim Eureka-Server registriert sind bzw. der API-Gateway eine veraltete Version der Liste der beim Eureka-Server registrierten Server vorliegen hat. Da der API-Gateway in diesem Fall den jeweiligen Service nicht findet wird er eine Weiterleitung verweigern und eine Fehlermeldung auslösen. Ist das der Fall empfiehlt es sich einige Sekunden (mindestens dreißig Sekunden) zu warten bis der API-Gateway sich eine neue Version der Liste der Services besorgt hat. ## Submodule aktualisieren Um die submodule zu aktualisieren kann im microservice Projekt folgender Befehl eingegeben werden... ``` git submodule foreach git pull origin master ``` -## Hinzufügen eines neuen Service +## Hinzufügen eines neuen Service und einschränken des Zugriffs Um einen neuen Service zum Projekt hinzuzufügen und den Zugriff zu diesen auf bestimmte Benutzer zu beschränken müssen mehrere Schritte getan werden. -Als erstes muss definiert werden zu welchem Service bei welchem Anfrage-Pfad weitergeleitet wird. Dazu muss die unten abgebildete application.yml angepasst werden. +Als erstes muss definiert werden zu welchem Service bei welchem Anfrage-Pfad weitergeleitet wird. Dazu muss die unten abgebildete application.yml angepasst werden. Die unten abgebildete Datei befindet sich im Projekt api-gateway. spring: application: @@ -109,13 +109,13 @@ Als erstes muss definiert werden zu welchem Service bei welchem Anfrage-Pfad wei strip-prefix: false # Forward the request all together with the auth path sensitive-headers: Cookie, Set-Cookie # Avoid to send internal cookies to external entities -Wenn zum Beispiel der Service "test-service" beim angefragten Pfad "/test/" aufgerufen werden soll müssen folgende Zeilen zur Datei hinzugefügt werden... +Wenn zum Beispiel der Service "test-service" beim Pfad "/test/" aufgerufen werden soll müssen folgende Zeilen, unter dem Punkt "zuul: routes:" zur Datei hinzugefügt werden... test-service: path: /test/** service-id: test-service -Dann muss für den Pfad für welchen der Zugang beschränkt werden soll, in der unten abgebildeten Klasse SecurityConfiguration eine neue Beschränkung hinzugefügt werden . +Dann muss für den Pfad für welchen der Zugang beschränkt werden soll, in der unten abgebildeten Klasse SecurityConfiguration eine neue Beschränkung hinzugefügt werden. Die Klasse SecurityConfiguration befindet sich ebenfalls im Projekt api-gateway. package de.rtuni.ms.apig.config; @@ -179,9 +179,10 @@ Dann muss für den Pfad für welchen der Zugang beschränkt werden s //--------------------------------------------------------------------------------------------- } -Wenn zum Beispiel auf den Pfad "testPfad" nur Nutzer mit der Rolle "TESTER" zugreifen dürfen dann muss der folgende Code in der configure(HttpSecurity http)-Methode eingefügt werden. +Wenn zum Beispiel auf den Pfad "test" nur Nutzer mit der Rolle "TESTER" zugreifen dürfen dann muss der folgende Code in der configure(HttpSecurity http)-Methode eingefügt werden. + ``` - .antMatchers("/testPfad/**").hasRole("TESTER") + .antMatchers("/test/**").hasRole("TESTER") ``` -- GitLab