Spring Boot oauth2 динамически добавляет параметры для перенаправления URL

Я использую spring-security-oauth2-client. Redirect-uri в application.properties выглядит так:

spring.security.oauth2.client.registration.<client>.redirect-uri=https://custom-server.com/auth

Мне нужно динамически добавить некоторую информацию к URL-адресу, например, через параметр пути, вот так: https://custom-server.com/auth?id=123 или https://custom-server.com/auth?id=321

SecurityConfig приведен ниже:

@Configuration
@EnableWebSecurity
public class SecurityConfig {
  @Bean
  public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http.csrf()
        .disable()
        .authorizeRequests()
        .antMatchers("/login/auth").authenticated()
        .anyRequest().permitAll()
        .and()
        .oauth2Login();
    return http.build();
  }
}

можно ли добавить параметры (запрос или путь) к redirect-url в зависимости от условий?

это вопрос, который вы ищете?

wjans 21.11.2022 19:39

Спасибо, @wjans! Да, я решил эту проблему, внедрив OAuth2AuthorizationRequestResolver.

Mrthesowhat Mrthesowhatov 22.11.2022 07:51
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
0
2
95
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, как упомянул @wjans, передача параметра в URL-адрес перенаправления возможна путем реализации OAuth2AuthorizationRequestResolver:


    public class CustomOAuth2AuthorizationRequestResolverimplements
        OAuth2AuthorizationRequestResolver {
    
      private static final String CUSTOM_PARAM = "id";
      private final OAuth2AuthorizationRequestResolver oAuth2AuthorizationRequestResolver;
    
      public ConfigurableOAuth2AuthorizationRequestResolver(OAuth2AuthorizationRequestResolver oAuth2AuthorizationRequestResolver) {
        this.oAuth2AuthorizationRequestResolver = oAuth2AuthorizationRequestResolver;
      }
    
      @Override
      public OAuth2AuthorizationRequest resolve(HttpServletRequest request) {
        OAuth2AuthorizationRequest authorizationRequest =
            this.oAuth2AuthorizationRequestResolver.resolve(request);
        return processAdditionalParameters(authorizationRequest);
      }
    
      @Override
      public OAuth2AuthorizationRequest resolve(HttpServletRequest request,
                                                String clientRegistrationId) {
        OAuth2AuthorizationRequest authorizationRequest =
            this.oAuth2AuthorizationRequestResolver.resolve(request, clientRegistrationId);
        return processAdditionalParameters(authorizationRequest);
      }
    
      private OAuth2AuthorizationRequest processAdditionalParameters(OAuth2AuthorizationRequest authorizationRequest) {
        if (authorizationRequest == null) {
          return null;
        }
        String redirectUri = UriComponentsBuilder
            .fromUriString(authorizationRequest.getRedirectUri())
            .queryParam(CUSTOM_PARAM, UUID.randomUUID())
            .build(true).toUriString();
        return OAuth2AuthorizationRequest.from(authorizationRequest)
            .redirectUri(redirectUri)
            .build();
      }
    }

и зарегистрируйте этот преобразователь как:

    @Bean
      public OAuth2AuthorizationRequestResolver authorizationRequestResolver() {
        OAuth2AuthorizationRequestResolver defaultAuthorizationRequestResolver =
            new DefaultOAuth2AuthorizationRequestResolver(
                clientRegistrationRepository(),            
OAuth2AuthorizationRequestRedirectFilter.DEFAULT_AUTHORIZATION_REQUEST_BASE_URI
            );
        return new CustomOAuth2AuthorizationRequestResolver(defaultAuthorizationRequestResolver);
      }
    
      @Bean
      public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            ...
            .oauth2Login()
            .authorizationEndpoint()
            .authorizationRequestResolver(
                authorizationRequestResolver());
    
        return http.build();
      }

Другие вопросы по теме