webflux oauth
This commit is contained in:
@@ -0,0 +1,19 @@
|
||||
package com.baeldung.reactive.oauth;
|
||||
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
|
||||
import org.springframework.security.config.web.server.ServerHttpSecurity;
|
||||
import org.springframework.security.web.server.SecurityWebFilterChain;
|
||||
|
||||
@EnableWebFluxSecurity
|
||||
public class SecurityConfig {
|
||||
|
||||
@Bean
|
||||
public SecurityWebFilterChain configure(ServerHttpSecurity http) throws Exception {
|
||||
return http.authorizeExchange()
|
||||
.pathMatchers("/about").permitAll()
|
||||
.anyExchange().authenticated()
|
||||
.and().oauth2Login()
|
||||
.and().build();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package com.baeldung.reactive.oauth;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository;
|
||||
import org.springframework.security.oauth2.client.web.reactive.function.client.ServerOAuth2AuthorizedClientExchangeFilterFunction;
|
||||
import org.springframework.security.oauth2.client.web.server.ServerOAuth2AuthorizedClientRepository;
|
||||
import org.springframework.web.reactive.function.client.WebClient;
|
||||
|
||||
@SpringBootApplication
|
||||
public class Spring5ReactiveOauthApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(Spring5ReactiveOauthApplication.class, args);
|
||||
}
|
||||
|
||||
@Bean
|
||||
public WebClient webClient(ReactiveClientRegistrationRepository clientRegistrationRepo, ServerOAuth2AuthorizedClientRepository authorizedClientRepo) {
|
||||
ServerOAuth2AuthorizedClientExchangeFilterFunction filter = new ServerOAuth2AuthorizedClientExchangeFilterFunction(clientRegistrationRepo, authorizedClientRepo);
|
||||
return WebClient.builder()
|
||||
.filter(filter)
|
||||
.build();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
package com.baeldung.reactive.oauth.web;
|
||||
|
||||
import static org.springframework.security.oauth2.client.web.reactive.function.client.ServerOAuth2AuthorizedClientExchangeFilterFunction.oauth2AuthorizedClient;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.security.core.annotation.AuthenticationPrincipal;
|
||||
import org.springframework.security.oauth2.client.OAuth2AuthorizedClient;
|
||||
import org.springframework.security.oauth2.client.annotation.RegisteredOAuth2AuthorizedClient;
|
||||
import org.springframework.security.oauth2.core.user.OAuth2User;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.reactive.function.client.WebClient;
|
||||
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
import com.baeldung.reactive.oauth.web.dto.Foo;
|
||||
|
||||
@RestController
|
||||
public class MainController {
|
||||
|
||||
@Autowired
|
||||
private WebClient webClient;
|
||||
|
||||
@GetMapping("/")
|
||||
public Mono<String> index(@AuthenticationPrincipal Mono<OAuth2User> oauth2User) {
|
||||
return oauth2User
|
||||
.map(OAuth2User::getName)
|
||||
.map(name -> String.format("Hi, %s", name));
|
||||
}
|
||||
|
||||
@GetMapping("/foos/{id}")
|
||||
public Mono<Foo> 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);
|
||||
}
|
||||
|
||||
@GetMapping("/about")
|
||||
public String getAboutPage() {
|
||||
return "WebFlux OAuth example";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
package com.baeldung.reactive.oauth.web.dto;
|
||||
|
||||
public class Foo {
|
||||
private long id;
|
||||
private String name;
|
||||
|
||||
public Foo() {
|
||||
super();
|
||||
}
|
||||
|
||||
public Foo(final long id, final String name) {
|
||||
super();
|
||||
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
public long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(final long id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(final String name) {
|
||||
this.name = name;
|
||||
}
|
||||
}
|
||||
20
spring-5-reactive-oauth/src/main/resources/application.yml
Normal file
20
spring-5-reactive-oauth/src/main/resources/application.yml
Normal file
@@ -0,0 +1,20 @@
|
||||
spring:
|
||||
security:
|
||||
oauth2:
|
||||
client:
|
||||
registration:
|
||||
google:
|
||||
client-id: YOUR_APP_CLIENT_ID
|
||||
client-secret: YOUR_APP_CLIENT_SECRET
|
||||
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
|
||||
@@ -0,0 +1,16 @@
|
||||
package com.baeldung.reactive.oauth;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
|
||||
@RunWith(SpringRunner.class)
|
||||
@SpringBootTest
|
||||
public class Spring5ReactiveOauthIntegrationTest {
|
||||
|
||||
@Test
|
||||
public void contextLoads() {
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user