Connexion Spring Security OAuth avec WebFlux
1. Vue d'ensemble
Spring Security a ajouté la prise en charge de OAuth pour WebFlux à partir de l’AG 5.1.x.
Nous discuterons dehow to configure our WebFlux application to use OAuth2 Login support. Nous verrons également comment utiliserWebClient pour accéder aux ressources sécurisées OAuth2.
La configuration de la connexion OAuth pour Webflux est similaire à celle d'une application Web MVC standard. Pour plus de détails à ce sujet, consultez également notre article sur lesSpring OAuth2Login element.
2. Configuration Maven
Pour commencer, nous allons créer une application Spring Boot simple et ajouter ces dépendances à nospom.xml:
org.springframework.boot
spring-boot-starter-security
org.springframework.boot
spring-boot-starter-webflux
org.springframework.security
spring-security-oauth2-client
Les dépendancesspring-boot-starter-security,spring-boot-starter-webflux etspring-security-oauth2-client sont disponibles sur Maven Central.
3. Contrôleur principal
Ensuite, nous allons ajouter un contrôleur simple pour afficher le nom d'utilisateur sur la page d'accueil:
@RestController
public class MainController {
@GetMapping("/")
public Mono index(@AuthenticationPrincipal Mono oauth2User) {
return oauth2User
.map(OAuth2User::getName)
.map(name -> String.format("Hi, %s", name));
}
}
Notez quewe’ll display the username obtained from OAuth2 client UserInfo endpoint.
4. Connexion à l'aide de Google
Maintenant, nous allons configurer notre application pour prendre en charge la connexion à l'aide de Google.
Tout d'abord, nous devons créer un nouveau projet àGoogle Developer Console
Maintenant, nous devons ajouter des informations d'identification OAuth2 (Créer des informations d'identification> ID client OAuth).
Ensuite, nous ajouterons ceci aux "URI de redirection autorisés":
http://localhost:8080/login/oauth2/code/google
Ensuite,we need to configure our application.yml to use the Client ID and Secret:
spring:
security:
oauth2:
client:
registration:
google:
client-id: YOUR_APP_CLIENT_ID
client-secret: YOUR_APP_CLIENT_SECRET
Comme nous avonsspring-security-oauth2-client sur notre chemin, notre application sera sécurisée.
Les utilisateurs seront redirigés pour se connecter à l'aide de Google avant de pouvoir accéder à notre page d'accueil.
5. Connexion à l'aide du fournisseur d'authentification
Nous pouvons également configurer notre application pour se connecter à partir d'un serveur d'autorisation personnalisé.
Dans l'exemple suivant, nous utiliserons notre serveur d'autorisation à partir d'unprevious article.
Cette fois, nous devons configurer plus de propriétés, pas seulement le ClientID et le Client Secret:
spring:
security:
oauth2:
client:
registration:
custom:
client-id: fooClientIdPassword
client-secret: secret
scopes: read,foo
authorization-grant-type: authorization_code
redirect-uri-template: http://localhost:8080/login/oauth2/code/custom
provider:
custom:
authorization-uri: http://localhost:8081/spring-security-oauth-server/oauth/authorize
token-uri: http://localhost:8081/spring-security-oauth-server/oauth/token
user-info-uri: http://localhost:8088/spring-security-oauth-resource/users/extra
user-name-attribute: user_name
Dans ce cas, nous devons également spécifier lesscope,grant type etredirect URI pour le client OAuth2. Nous fournirons également lesauthorization ettoken URI du serveur d’autorisation.
Enfin, nous devons également configurer le point de terminaisonUserInfo pour pouvoir obtenir les détails d'authentification de l'utilisateur.
6. Configuration de sécurité
Par défaut, Spring Security sécurise tous les chemins. Par conséquent, si nous n'avons qu'un seul client OAuth, nous serons redirigés pour autoriser ce client et nous connecter.
Si plusieurs clients OAuth sont enregistrés, une page de connexion sera automatiquement créée pour choisir la méthode de connexion.
Nous pouvons changer cela si nous aimons etprovide a detailed security configuration:
@EnableWebFluxSecurity
public class SecurityConfig {
@Bean
public SecurityWebFilterChain configure(ServerHttpSecurity http) throws Exception {
return http.authorizeExchange()
.pathMatchers("/about").permitAll()
.anyExchange().authenticated()
.and().oauth2Login()
.and().build();
}
}
Dans cet exemple, nous avons sécurisé tous les chemins à l'exception de "/ about".
7. WebClient
Nous pouvons également faire plus que simplement authentifier les utilisateurs à l’aide de OAuth2. We can use WebClient to access OAuth2 secured resources using OAuth2AuthorizedClient.
Maintenant, configurons nosWebClient:
@Bean
public WebClient webClient(ReactiveClientRegistrationRepository clientRegistrationRepo,
ServerOAuth2AuthorizedClientRepository authorizedClientRepo) {
ServerOAuth2AuthorizedClientExchangeFilterFunction filter =
new ServerOAuth2AuthorizedClientExchangeFilterFunction(clientRegistrationRepo, authorizedClientRepo);
return WebClient.builder().filter(filter).build();
}
Ensuite, nous pouvons récupérer une ressource sécurisée OAuth2:
@Autowired
private WebClient webClient;
@GetMapping("/foos/{id}")
public Mono getFooResource(@RegisteredOAuth2AuthorizedClient("custom")
OAuth2AuthorizedClient client, @PathVariable final long id){
return webClient
.get()
.uri("http://localhost:8088/spring-security-oauth-resource/foos/{id}", id)
.attributes(oauth2AuthorizedClient(client))
.retrieve()
.bodyToMono(Foo.class);
}
Notez quewe retrieved the remote resource Foo using AccessToken from*OAuth2AuthorizedClient*.
8. Conclusion
Dans cet article rapide, nous avons appris à configurer notre application WebFlux pour utiliser le support de connexion OAuth2 et à utiliser WebClient pour accéder aux ressources sécurisées OAuth2.
Comme toujours, le code source complet est disponibleover on GitHub.