Добавление параметров запроса для URL авторизации в spring.security.oauth2.client перед перенаправлением - PullRequest
0 голосов
/ 29 мая 2019

В настоящее время у меня есть приложение Gateway, которое использует сервер Netty и OAuth2 вместе со шлюзом. В настоящее время он использует ReactiveClientRegistrationRepository, @EnableWebFluxSecurity и ServerHttpSecurity для настройки безопасности.

В настоящее время мой application.yml выглядит так:

spring:
  profiles: local
  autoconfigure: #TODO: track issue https://github.com/spring-projects/spring-security/issues/6314
    exclude: org.springframework.boot.actuate.autoconfigure.security.reactive.ReactiveManagementWebSecurityAutoConfiguration
  security:
    oauth2:
      client:
        registration:
          azure:
            provider: azure
            client-id: ...
            client-secret: ...
            authorization-grant-type: authorization_code
            redirect-uri-template: "{baseUrl}/login/oauth2/code/{registrationId}"
            scope: ...
        provider:
          azure:
            authorization-uri: https://login....com/oauth2/authorize
            token-uri: https://login.com/oauth2/token
            user-info-uri: https://login.com/openid/userinfo
            jwk-set-uri: https://login.com/discovery/keys
            issuer-url: https://login.com/
            user-name-attribute: upn

У меня есть требование добавить параметр запроса (в дополнение к настройкам по умолчанию, таким как область и состояние). Это может быть что-то вроде

"https://login. ... ком / oauth2 / авторизовать? IDP = IDP1 "

Я уже пытался добавить фильтр для изменения местоположения и добавления параметров запроса, а также добавления параметра запроса к URL-адресу авторизации в файле yml.

Последнее приводит к ошибке: из-за того, что теперь в URL есть 2 ?.

Invalid character '=' for QUERY_PARAM in "true?response_type=code"


@EnableWebFluxSecurity
public class SecurityConfig {

    @Value("${content.security.policy}")
    private String contentSecurityPolicy;

    @Bean
    public SecurityWebFilterChain configure(ServerHttpSecurity http) {

        return http
                .authorizeExchange()
                .anyExchange().authenticated()
                .and().oauth2Login()
                .and().headers().contentSecurityPolicy(contentSecurityPolicy).and()
                .and().build();
    }

@Configuration
public class OAuthWebClientConfig {

    @Bean
    WebClient webClient(ReactiveClientRegistrationRepository clientRegistrationRepository,
                        ServerOAuth2AuthorizedClientRepository authorizedClientRepository) {
        ServerOAuth2AuthorizedClientExchangeFilterFunction oauth =
                new ServerOAuth2AuthorizedClientExchangeFilterFunction(clientRegistrationRepository, authorizedClientRepository);
        // (optional) explicitly opt into using the oauth2Login to provide an access token implicitly
        oauth.setDefaultOAuth2AuthorizedClient(true);
        return WebClient.builder()
                .filter(oauth)
                .build();
    }

зависимости build.gradle

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
    implementation 'org.bitbucket.b_c:jose4j:0.5.0'
    implementation 'com.google.code.gson:gson:2.8.5'
    implementation 'commons-codec:commons-codec:1.11'
    implementation 'org.springframework.cloud:spring-cloud-starter-contract-stub-runner'
    implementation 'io.reactivex:rxjava:1.3.8'
    implementation 'org.springframework.boot:spring-boot-configuration-processor'
    implementation 'com.google.guava:guava:23.5-jre'

    compile group: 'org.springframework.boot', name: 'spring-boot-starter-oauth2-client', version: '2.1.5.RELEASE'

    implementation 'org.springframework.boot:spring-boot-starter-webflux'
    compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-security', version: '2.1.2.RELEASE'

    compileOnly 'org.projectlombok:lombok'

    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'com.microsoft.azure:adal4j:1.6.4'
}

ОЖИДАЕТСЯ: URL авторизации генерируется с помощью обычных параметров запроса, таких как: redirect_uri, scope, state и параметры CUSTOM, такие как idp в примере.

АКТУАЛЬНО: Добавление в файл yml приводит к ошибке Invalid character '=' for QUERY_PARAM in "true?response_type=code" oauth2Login () в ServerHttpSecurity не имеет простого способа переопределить URL авторизации. Есть ли способ?

...