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.