Eine Einführung in die Spring Cloud-Sicherheit

Eine Einführung in die Spring Cloud-Sicherheit

1. Überblick

Das Spring Cloud-Sicherheitsmodul bietet Funktionen für die tokenbasierte Sicherheit in Spring Boot-Anwendungen.

Insbesondere erleichtert es OAuth2-basiertes SSO - mit Unterstützung für die Weitergabe 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 in diesem Beispiel nur eine Clientanwendung SSO verwendet, um die Cloud-Sicherheitsfunktionen zu demonstrieren. In einem typischen Szenario sind jedoch mindestens zwei Clientanwendungen erforderlich, um die Notwendigkeit eines einmaligen Anmeldens zu rechtfertigen.

2. Schnellstart einer Cloud Security App

Beginnen wir mitconfiguring SSO in a Spring Boot application.

Zuerst müssen wir die Abhängigkeit vonspring-cloud-starter-oauth2hinzufügen:


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

Dies führt auch zu einer Abhängigkeit vonspring-cloud-starter-security.

We can configure any social site as an Auth Server for our site or we can use our own server. In our case, we’ve chosen the latter option and configured an application that acts as an Authorization Server – which is wurde lokal beihttp://localhost:7070/authserver. bereitgestellt

Unser Autorisierungsserver verwendet JWT-Token.

Damit ein Client die Anmeldeinformationen eines Benutzers abrufen kann, muss der auf Port 9000 ausgeführte Resource Server mit einem Endpunkt konfiguriert werden, der diese Anmeldeinformationen bereitstellen kann.

Hier haben wir den Endpunkt eines /userkonfiguriert, der beihttp://localhost:9000/user. verfügbar ist

Weitere Informationen zum Einrichten eines Autorisierungsservers und eines Ressourcenservers finden Sie in unserenprevious article here.

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 {
        // ...
    }
}

Any requests that require authentication will be redirected to the Authorization Server. Damit dies funktioniert, müssen wir auch die Servereigenschaften definieren:

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

Beachten Sie, dass wirspring-boot-starter-security 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@EnableOauth2Ssodeklariert haben, fügt Spring Boot dem Anforderungsbereich eine BeanOAuth2ClientContexthinzu. Basierend darauf können wir unsere eigenenOAuth2RestTemplate in unserer Client-Anwendung 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 mitRestTemplate

Wir haben zuvor in unserer Client-Anwendung einerestOperations-Bean vom TypOAuth2RestTemplate definiert. Infolgedessenwe can use the getForObject() method of OAuth2RestTemplate to send a request with the necessary tokens to a protected Resource server von unserem Kunden.

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 einesPerson-Objekts zurückgibt.

Nunwe can send a request from the Client application using the getForObject() method which will relay the token to the Resource Server:

@Autowired
private RestOperations restOperations;

@GetMapping("/personInfo")
public ModelAndView person() {
    ModelAndView mav = new ModelAndView("personinfo");
    String personResourceUrl = "http://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 @EnableZuulProxyzu unserer Konfigurationsklasse in der Client-Anwendung hinzufügen:

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

Sie müssen nur noch die Zuul-Konfigurationseigenschaften zu unsererapplication.yml-Datei hinzufügen:

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

Alle Anforderungen, die an den Endpunkt von /apider 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 vonOauth2RestTemplate und Embedded Zuul Proxy zwischen Servern weitergeleitet werden.

Wie immer ist der Codeover on GitHub verfügbar.