Spring Security OAuth Войти через WebFlux

Spring Security OAuth Войти с помощью WebFlux

1. обзор

Spring Security добавил поддержку OAuth для WebFlux, начиная с 5.1.x GA.

Обсудимhow to configure our WebFlux application to use OAuth2 Login support. Мы также обсудим, как использоватьWebClient для доступа к защищенным ресурсам OAuth2.

Конфигурация входа OAuth для Webflux аналогична конфигурации для стандартного приложения Web MVC. Подробнее об этом читайте в нашей статье оSpring OAuth2Login element.

2. Конфигурация Maven

Для начала мы создадим простое приложение Spring Boot и добавим эти зависимости в нашpom.xml:


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


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


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

Зависимостиspring-boot-starter-security,spring-boot-starter-webflux иspring-security-oauth2-client доступны в Maven Central.

3. Главный контроллер

Затем мы добавим простой контроллер для отображения имени пользователя на главной странице:

@RestController
public class MainController {

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

Обратите внимание, чтоwe’ll display the username obtained from OAuth2 client UserInfo endpoint.

4. Войти через Google

Теперь мы настроим наше приложение для поддержки входа в систему с помощью Google.

Во-первых, нам нужно создать новый проект вGoogle Developer Console

Теперь нам нужно добавить учетные данные OAuth2 (Создать учетные данные> Идентификатор клиента OAuth).

Затем мы добавим это в «URI авторизованного перенаправления»:

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

Тогда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

Поскольку на нашем пути естьspring-security-oauth2-client, наше приложение будет защищено.

Пользователи будут перенаправлены для входа в систему с помощью Google, прежде чем они смогут получить доступ к нашей домашней странице.

5. Войти с помощью поставщика аутентификации

Мы также можем настроить наше приложение для входа в систему с настраиваемого сервера авторизации.

В следующем примере мы будем использовать наш сервер авторизации изprevious article.

На этот раз нам нужно настроить больше свойств, а не только ClientID и 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

В этом случае нам также необходимо указатьscope,grant type иredirect URI для клиента OAuth2. Мы также предоставимauthorization иtoken URI сервера авторизации.

Наконец, нам нужно настроить конечную точкуUserInfo, чтобы иметь возможность получать данные аутентификации пользователя.

6. Конфигурация безопасности

По умолчанию Spring Security защищает все пути. Следовательно, если у нас есть только один клиент OAuth, мы будем перенаправлены для авторизации этого клиента и входа в систему.

Если зарегистрировано несколько клиентов OAuth, автоматически будет создана страница входа для выбора метода входа.

Мы можем изменить это, если захотим иprovide 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();
    }
}

В этом примере мы защищаем все пути, кроме «/ about».

7. WebClientс

Мы также можем сделать больше, чем просто аутентифицировать пользователей, используя OAuth2. We can use WebClient to access OAuth2 secured resources using OAuth2AuthorizedClient.

Теперь давайте настроим нашWebClient:

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

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

Затем мы можем получить защищенный ресурс 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);
}

Обратите внимание, чтоwe retrieved the remote resource Foo using AccessToken from*OAuth2AuthorizedClient*.

8. Заключение

В этой быстрой статье мы узнали, как настроить наше приложение WebFlux для использования поддержки входа OAuth2 и как использовать WebClient для доступа к защищенным ресурсам OAuth2.

Как всегда, доступен полный исходный кодover on GitHub.