Перейти к основному содержимому

Вход в Spring Security OAuth с помощью WebFlux

· 4 мин. чтения

1. Обзор

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

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

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

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

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

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-client</artifactId>
</dependency>

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

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

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

@RestController
public class MainController {

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

Обратите внимание, что мы будем отображать имя пользователя, полученное из конечной точки UserInfo клиента OAuth2 .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

7. Веб-клиент

Мы также можем делать больше, чем просто аутентифицировать пользователей с помощью OAuth2. Мы можем использовать WebClient для доступа к защищенным ресурсам OAuth2 с помощью 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<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);
}

Обратите внимание, что мы получили удаленный ресурс Foo с помощью AccessToken из OAuth2AuthorizedClient .

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

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

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