Spring Security OAuth-Anmeldung mit WebFlux

Spring Security OAuth Login mit WebFlux

1. Überblick

Spring Security hat OAuth-Unterstützung für WebFlux hinzugefügt, beginnend mit der Version 5.1.x GA.

Wir werdenhow to configure our WebFlux application to use OAuth2 Login support diskutieren. Wir werden auch diskutieren, wieWebClient verwendet werden, um auf OAuth2-gesicherte Ressourcen zuzugreifen.

Die OAuth-Anmeldekonfiguration für Webflux ähnelt der für eine Standard-Web-MVC-Anwendung. Weitere Informationen hierzu finden Sie in unserem Artikel zuSpring OAuth2Login element.

2. Maven-Konfiguration

Zunächst erstellen wir eine einfache Spring Boot-Anwendung und fügen diese Abhängigkeiten zu unserenpom.xml hinzu:


    org.springframework.boot
    spring-boot-starter-security


    org.springframework.boot
    spring-boot-starter-webflux


    org.springframework.security
    spring-security-oauth2-client

Die Abhängigkeitenspring-boot-starter-security,spring-boot-starter-webflux undspring-security-oauth2-client sind in Maven Central verfügbar.

3. Hauptsteuerung

Als Nächstes fügen wir einen einfachen Controller hinzu, um den Benutzernamen auf der Startseite anzuzeigen:

@RestController
public class MainController {

    @GetMapping("/")
    public Mono index(@AuthenticationPrincipal Mono oauth2User) {
       return oauth2User
        .map(OAuth2User::getName)
        .map(name -> String.format("Hi, %s", name));
    }
}

Beachten Sie, dasswe’ll display the username obtained from OAuth2 client UserInfo endpoint.

4. Mit Google anmelden

Jetzt konfigurieren wir unsere Anwendung so, dass die Anmeldung mit Google unterstützt wird.

Zuerst müssen wir ein neues Projekt beiGoogle Developer Console erstellen

Jetzt müssen wir OAuth2-Anmeldeinformationen hinzufügen (Anmeldeinformationen erstellen> OAuth-Client-ID).

Als Nächstes fügen wir dies zu "Authorized Redirect URIs" hinzu:

http://localhost:8080/login/oauth2/code/google

Dannwe 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

Da wirspring-security-oauth2-client in unserem Pfad haben, wird unsere Anwendung gesichert.

Nutzer werden weitergeleitet, um sich mit Google anzumelden, bevor sie auf unsere Startseite zugreifen können.

5. Melden Sie sich mit Auth Provider an

Wir können unsere Anwendung auch so konfigurieren, dass sie sich von einem benutzerdefinierten Autorisierungsserver aus anmeldet.

Im folgenden Beispiel verwenden wir unseren Autorisierungsserver ab einemprevious article.

Dieses Mal müssen wir mehr Eigenschaften konfigurieren, nicht nur die Client-ID und das Client-Geheimnis:

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

In diesem Fall müssen wir auch diescope,grant type undredirect URI für den OAuth2-Client angeben. Wir stellen auch dieauthorization undtoken URI des Autorisierungsservers bereit.

Schließlich müssen wir auch den Endpunkt vonUserInfokonfigurieren, um die Details der Benutzerauthentifizierung abrufen zu können.

6. Sicherheitskonfiguration

Standardmäßig sichert Spring Security alle Pfade. Wenn wir also nur einen OAuth-Client haben, werden wir umgeleitet, um diesen Client zu autorisieren und uns anzumelden.

Wenn mehrere OAuth-Clients registriert sind, wird automatisch eine Anmeldeseite erstellt, auf der Sie die Anmeldemethode auswählen können.

Wir können das ändern, wenn wir möchten undprovide 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();
    }
}

In diesem Beispiel haben wir alle Pfade außer "/ about" gesichert.

7. WebClient

Wir können auch mehr als nur Benutzer mit OAuth2 authentifizieren. We can use WebClient to access OAuth2 secured resources using OAuth2AuthorizedClient.

Konfigurieren wir nun unsereWebClient:

@Bean
public WebClient webClient(ReactiveClientRegistrationRepository clientRegistrationRepo,
  ServerOAuth2AuthorizedClientRepository authorizedClientRepo) {
    ServerOAuth2AuthorizedClientExchangeFilterFunction filter =
      new ServerOAuth2AuthorizedClientExchangeFilterFunction(clientRegistrationRepo, authorizedClientRepo);

    return WebClient.builder().filter(filter).build();
}

Dann können wir eine OAuth2-gesicherte Ressource abrufen:

@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);
}

Beachten Sie, dasswe retrieved the remote resource Foo using AccessToken from*OAuth2AuthorizedClient*.

8. Fazit

In diesem kurzen Artikel haben wir gelernt, wie unsere WebFlux-Anwendung für die Verwendung der OAuth2-Anmeldeunterstützung konfiguriert wird und wie mit WebClient auf gesicherte OAuth2-Ressourcen zugegriffen wird.

Wie immer ist der vollständige Quellcodeover on GitHub verfügbar.