Весенняя безопасность 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 Monoindex(@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 MonogetFooResource(@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 .