Рубрики
Без рубрики

Весенняя безопасность OAuth Логин с WebFlux

Настройте поддержку OAuth Login в приложении Spring Webflux.

Автор оригинала: baeldung.

Весенняя безопасность OAuth Логин с WebFlux

1. Обзор

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

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

Конфигурация OAuth Login для Webflux аналогична конфигурации стандартного web MVC-приложения. Для получения более подробной информации по этому вопросу, а также взглянуть на нашу статью о Весна OAuth2Login элемент .

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

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


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


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


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

весна-загрузка-стартер-безопасности , весна-загрузка-стартер-webflux и весна-безопасность-oauth2-клиент зависимости доступны на 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));
    }
}

Обратите внимание, что Мы отображаем имя пользователя, полученное от клиента OAuth2 ПользовательИнфо конечная точка .

4. Войти с помощью Google

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

Во-первых, мы должны создать новый проект на Консоль разработчика Google

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

Далее мы добавим это к “Авторизованным перенаправлениям URL-адресов”:

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

Затем, мы должны настроить наши application.yml использовать идентификатор клиента и секретный :

spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: YOUR_APP_CLIENT_ID
            client-secret: YOUR_APP_CLIENT_SECRET

Как мы весна-безопасность-oauth2-клиент на нашем пути, наше приложение будет обеспечено.

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

5. Войти с помощью Auth провайдера

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

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

На этот раз нам нужно настроить больше свойств, а не только ClientID и секрет клиента:

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

В этом случае мы также должны указать сферы, грант типа и перенаправить URI для клиента OAuth2. Мы также предоставим авторизация и токен URI сервера авторизации.

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

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

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

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

Мы можем изменить это, если захеем и предоставить подробную конфигурацию безопасности :

@EnableWebFluxSecurity
public class SecurityConfig {

    @Bean
    public SecurityWebFilterChain configure(ServerHttpSecurity http) throws Exception {
        return http.authorizeExchange()
          .pathMatchers("/about").permitAll()
          .anyExchange().authenticated()
          .and().oauth2Login()
          .and().build();
    }
}

В этом примере мы закрепили все пути, за исключением “/о”.

7. WebClient

Мы также можем сделать больше, чем просто аутентификация пользователей с помощью OAuth2. Мы можем использовать WebClient доступ к защищенным ресурсам OAuth2 с использованием OAuth2 АвторизованныйКлиент .

Теперь давайте настраивать наши 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); 
}

Обратите внимание, что мы извлекли удаленный ресурс Фу с помощью ДоступТокен из OAuth2 АвторизованныйКлиент .

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

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

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