В настоящее время у меня есть приложение 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 авторизации. Есть ли способ?