diff --git a/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/SpringSecurityOAuth2BindingsPropertiesProcessor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/SpringSecurityOAuth2BindingsPropertiesProcessor.java index fde51b1..485e5e7 100644 --- a/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/SpringSecurityOAuth2BindingsPropertiesProcessor.java +++ b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/SpringSecurityOAuth2BindingsPropertiesProcessor.java @@ -58,7 +58,9 @@ public void process(Environment environment, Bindings bindings, Map + * From Security 6 upwards (Boot 3+), "basic" and "post" have been removed. + *

+ * This transforms "client_secret_basic" to "basic" and "client_secret_post" to "post", so that it works with every + * Boot 2 version, even Boot < 2.5. + * + * @param clientAuthenticationMethod the base client authentication method + * @return "basic" instead of "client_secret_basic", "post" instead of "client_secret_post", the input otherwise + */ + @Nullable + private static String toBackwardsCompatibleClientAuthenticationMethod(@Nullable String clientAuthenticationMethod) { + if ("client_secret_basic".equalsIgnoreCase(clientAuthenticationMethod)) { + return "basic"; + } + if ("client_secret_post".equalsIgnoreCase(clientAuthenticationMethod)) { + return "post"; + } + return clientAuthenticationMethod; + } + @Override public void onApplicationEvent(ApplicationPreparedEvent event) { LOG.replayTo(getClass()); diff --git a/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/SpringSecurityOAuth2BindingsPropertiesProcessorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/SpringSecurityOAuth2BindingsPropertiesProcessorTest.java index db39e80..c973485 100644 --- a/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/SpringSecurityOAuth2BindingsPropertiesProcessorTest.java +++ b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/SpringSecurityOAuth2BindingsPropertiesProcessorTest.java @@ -209,6 +209,30 @@ void testRedirectUriAndRedirectUris() { .containsEntry("spring.security.oauth2.client.registration.binding-name.redirect-uri", "https://other-app.example.com/login"); } + @Test + @DisplayName("uses Spring-Security 5.4-compatible ClientAuthenticationMethod") + void backwardsCompatibleClientAuthenticationMethod() { + Bindings clientSecretBasic = new Bindings(new Binding("binding-name", Paths.get("test-path"), + new FluentMap() + .withEntry(Binding.TYPE, TYPE) + .withEntry("provider", "some-provider") + .withEntry("client-authentication-method", "client_secret_basic") + )); + new SpringSecurityOAuth2BindingsPropertiesProcessor().process(new MockEnvironment(), clientSecretBasic, properties); + assertThat(properties) + .containsEntry("spring.security.oauth2.client.registration.binding-name.client-authentication-method", "basic"); + + Bindings clientSecretPost = new Bindings(new Binding("binding-name", Paths.get("test-path"), + new FluentMap() + .withEntry(Binding.TYPE, TYPE) + .withEntry("provider", "some-provider") + .withEntry("client-authentication-method", "client_secret_post") + )); + new SpringSecurityOAuth2BindingsPropertiesProcessor().process(new MockEnvironment(), clientSecretPost, properties); + assertThat(properties) + .containsEntry("spring.security.oauth2.client.registration.binding-name.client-authentication-method", "post"); + } + @Test @DisplayName("can be disabled") void disabled() {