Eine Einführung in Spring Cloud Security

1. Übersicht

Das Spring Cloud Security-Modul bietet Funktionen zur tokenbasierten Sicherheit in Spring Boot-Anwendungen.

Insbesondere erleichtert es OAuth2-basiertes SSO - mit Unterstützung für das Weiterleiten von Token zwischen Ressourcenservern sowie für die Konfiguration der Downstream-Authentifizierung mithilfe eines eingebetteten Zuul-Proxys.

In diesem kurzen Artikel sehen wir uns an, wie wir diese Funktionen mithilfe einer Spring Boot-Clientanwendung, eines Autorisierungsservers und einer REST-API konfigurieren können, die als Ressourcenserver fungieren.

Beachten Sie, dass wir in diesem Beispiel nur eine Client-Anwendung haben, die SSO verwendet, um die Cloud-Sicherheitsfunktionen zu demonstrieren. In einem typischen Szenario hätten wir jedoch mindestens zwei Client-Anwendungen, um die Notwendigkeit von Single Sign-On zu rechtfertigen.

2. Schnellstart einer Cloud Security App

Beginnen wir mit der Konfiguration von SSO in einer Spring Boot-Anwendung.

Zuerst müssen wir die Spring-Cloud-Starter-Oauth2- Abhängigkeit hinzufügen :

 org.springframework.cloud spring-cloud-starter-oauth2 2.2.2.RELEASE 

Dies wird auch die Sicherheitsabhängigkeit von Spring-Cloud-Starter-Sicherheit mit sich bringen .

Wir können jede soziale Site als Auth-Server für unsere Site konfigurieren oder unseren eigenen Server verwenden. In unserem Fall haben wir die letztere Option ausgewählt und eine Anwendung konfiguriert, die als Autorisierungsserver fungiert und lokal unter // localhost: 7070 / authserver bereitgestellt wird.

Unser Autorisierungsserver verwendet JWT-Token.

Damit jeder Client die Anmeldeinformationen eines Benutzers abrufen kann, muss außerdem unser Ressourcenserver, der auf Port 9000 ausgeführt wird, mit einem Endpunkt konfiguriert werden, der diese Anmeldeinformationen bereitstellen kann.

Hier haben wir einen / user- Endpunkt konfiguriert , der unter // localhost: 9000 / user verfügbar ist .

Weitere Informationen zum Einrichten eines Autorisierungsservers und eines Ressourcenservers finden Sie in unserem vorherigen Artikel hier.

Wir können jetzt die Anmerkung in einer Konfigurationsklasse in unserer Client-Anwendung hinzufügen:

@Configuration @EnableOAuth2Sso public class SiteSecurityConfigurer extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { // ... } }

Alle Anforderungen, die eine Authentifizierung erfordern, werden an den Autorisierungsserver umgeleitet. Damit dies funktioniert, müssen wir auch die Servereigenschaften definieren:

security: oauth2: client: accessTokenUri: //localhost:7070/authserver/oauth/token userAuthorizationUri: //localhost:7070/authserver/oauth/authorize clientId: authserver clientSecret: passwordforauthserver resource: userInfoUri: //localhost:9000/user

Beachten Sie, dass wir Spring-Boot-Starter-Sicherheit in unserem Klassenpfad haben müssen, damit die obige Konfiguration funktioniert.

3. Weiterleiten von Zugriffstoken

Während der Weiterleitung eines Tokens leitet ein OAuth2-Client das von ihm empfangene OAuth2-Token an eine ausgehende Ressourcenanforderung weiter.

Da wir die Annotation @ EnableOauth2Sso deklariert haben , fügt Spring Boot dem Anforderungsbereich eine OAuth2ClientContext- Bean hinzu . Auf dieser Grundlage können wir in unserer Client-Anwendung unser eigenes OAuth2RestTemplate erstellen:

@Bean public OAuth2RestOperations restOperations( OAuth2ProtectedResourceDetails resource, OAuth2ClientContext context) { return new OAuth2RestTemplate(resource, context); }

Sobald wir die Bean konfiguriert haben , leitet der Kontext das Zugriffstoken an die angeforderten Dienste weiter und aktualisiert das Token auch, wenn es abläuft.

4. Weiterleiten eines OAuth-Tokens mithilfe der RestTemplate

Wir haben zuvor in unserer Client-Anwendung eine restOperations- Bean vom Typ OAuth2RestTemplate definiert . Daher können wir die Methode getForObject () von OAuth2RestTemplate verwenden , um eine Anforderung mit den erforderlichen Token von unserem Client an einen geschützten Ressourcenserver zu senden .

Definieren wir zunächst einen Endpunkt, für den eine Authentifizierung in unserem Ressourcenserver erforderlich ist:

@GetMapping("/person") @PreAuthorize("hasAnyRole('ADMIN', 'USER')") public @ResponseBody Person personInfo(){ return new Person("abir", "Dhaka", "Bangladesh", 29, "Male"); } 

Dies ist ein einfacher REST-Endpunkt, der eine JSON-Darstellung eines Personenobjekts zurückgibt .

Jetzt können wir mit der Methode getForObject () eine Anforderung von der Client-Anwendung senden , die das Token an den Ressourcenserver weiterleitet :

@Autowired private RestOperations restOperations; @GetMapping("/personInfo") public ModelAndView person() { ModelAndView mav = new ModelAndView("personinfo"); String personResourceUrl = "//localhost:9000/person"; mav.addObject("person", restOperations.getForObject(personResourceUrl, String.class)); return mav; }

5. Zuul für Token Relay konfigurieren

Wenn wir ein Token Downstream an die Proxy-Dienste weiterleiten möchten, können wir Spring Cloud Zuul Embedded Reverse Proxy verwenden.

Zuerst müssen wir die Maven-Abhängigkeit für die Arbeit mit Zuul hinzufügen:

 org.springframework.cloud spring-cloud-starter-netflix-zuul 

Als Nächstes müssen wir die Annotation @ EnableZuulProxy zu unserer Konfigurationsklasse in der Clientanwendung hinzufügen :

@Configuration @EnableOAuth2Sso @EnableZuulProxy public class SiteSecurityConfigurer extends WebSecurityConfigurerAdapter { //... }

Sie müssen lediglich die Zuul-Konfigurationseigenschaften zu unserer Datei application.yml hinzufügen :

zuul: sensitiveHeaders: Cookie,Set-Cookie routes: resource: path: /api/** url: //localhost:9000 user: path: /user/** url: //localhost:9000/user

Alle Anforderungen, die an den Endpunkt / api der Clientanwendung gesendet werden, werden an die URL des Ressourcenservers umgeleitet. Wir müssen auch die URL des Endpunkts für Benutzeranmeldeinformationen angeben.

6. Fazit

In diesem kurzen Artikel haben wir untersucht, wie Sie Spring Cloud Security mit OAuth2 und Zuul verwenden, um gesicherte Autorisierungs- und Ressourcenserver zu konfigurieren, und wie OAuth2-Token mithilfe von Oauth2RestTemplate und Embedded Zuul Proxy zwischen Servern weitergeleitet werden .

Wie immer ist der Code auf GitHub verfügbar.