Une introduction à Spring Cloud Security

Une introduction à Spring Cloud Security

1. Vue d'ensemble

Le module Spring Cloud Security fournit des fonctionnalités liées à la sécurité à base de jetons dans les applications Spring Boot.

Plus précisément, elle simplifie la connexion unique basée sur OAuth2 - avec la prise en charge du relais des jetons entre les serveurs de ressources, ainsi que la configuration de l'authentification en aval à l'aide d'un proxy Zuul intégré.

Dans cet article rapide, nous allons voir comment nous pouvons configurer ces fonctionnalités à l'aide d'une application client Spring Boot, d'un serveur d'autorisation et d'une API REST fonctionnant comme un serveur de ressources.

Notez que dans cet exemple, une seule application cliente utilise l'authentification unique pour démontrer les fonctionnalités de sécurité dans le cloud. Toutefois, dans un scénario typique, nous aurions au moins deux applications clientes pour justifier le besoin de l'authentification unique.

2. Démarrage rapide d'une application de sécurité cloud

Commençons parconfiguring SSO in a Spring Boot application.

Tout d'abord, nous devons ajouter la dépendancespring-cloud-starter-oauth2:


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

Cela introduira également la dépendancespring-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 déployé localement àhttp://localhost:7070/authserver.

Notre serveur d'autorisation utilise des jetons JWT.

De plus, pour que tout client puisse récupérer les informations d'identification d'un utilisateur, nous devons configurer notre serveur de ressources, fonctionnant sur le port 9000, avec un point de terminaison pouvant servir ces informations d'identification.

Ici, nous avons configuré un point de terminaison /user disponible àhttp://localhost:9000/user.

Pour plus de détails sur la configuration d'un serveur d'autorisation et d'un serveur de ressources, consultez nosprevious article here.

Nous pouvons maintenant ajouter l'annotation dans une classe de configuration dans notre application client:

@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. Pour que cela fonctionne, nous devons également définir les propriétés du serveur:

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

Notez que nous devons avoirspring-boot-starter-security dans notre chemin de classe pour que la configuration ci-dessus fonctionne.

3. Relais de jetons d'accès

Lors du relais d'un jeton, un client OAuth2 transmet le jeton OAuth2 qu'il a reçu à une demande de ressource sortante.

Puisque nous avons déclaré l'annotation@EnableOauth2Sso, Spring Boot ajoute un beanOAuth2ClientContext dans la portée de la requête. Sur cette base, nous pouvons créer nos propresOAuth2RestTemplate dans notre application cliente:

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

Une fois que nous avons configuré le bean,, le contexte transmettra le jeton d'accès aux services demandés et actualisera également le jeton s'il expire.

4. Relais d'un jeton OAuth à l'aide desRestTemplate

Nous avons précédemment défini un beanrestOperations de typeOAuth2RestTemplate dans notre application Client. En conséquence,we can use the getForObject() method of OAuth2RestTemplate to send a request with the necessary tokens to a protected Resource server de notre client.

Tout d'abord, définissons un point de terminaison qui nécessite une authentification dans notre serveur de ressources:

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

Il s'agit d'un simple point de terminaison REST qui renvoie une représentation JSON d'un objetPerson.

Maintenant,we 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. Configurer Zuul pour Token Relay

Si nous souhaitons relayer un jeton en aval vers les services proxy, nous pouvons utiliser Spring Cloud Zuul Embedded Reverse Proxy.

Premièrement, nous devons ajouter la dépendance Maven pour travailler avec Zuul:


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

Ensuite, nous devons ajouter l'annotation @EnableZuulProxy à notre classe de configuration dans l'application client:

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

Il ne reste plus qu'à ajouter les propriétés de configuration Zuul à notre fichierapplication.yml:

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

Toute demande arrivant au point de terminaison /api de l'application cliente sera redirigée vers l'URL du serveur de ressources. Nous devons également fournir l'URL du point de terminaison des informations d'identification de l'utilisateur.

6. Conclusion

Dans cet article rapide, nous avons exploré comment utiliser Spring Cloud Security avec OAuth2 et Zuul pour configurer des serveurs d'autorisation et de ressources sécurisés, ainsi que comment relayer les jetons OAuth2 entre les serveurs à l'aide deOauth2RestTemplate et du proxy Zuul intégré.

Comme toujours, le code est disponibleover on GitHub.