Skip to content

Commit b0b8a18

Browse files
committed
Add oidcBackChannelLogout
This commit introduces the new top-level DSL method `oidcBackChannelLogout(Customizer<OidcLogoutConfigurer<HttpSecurity>>)` to simplify OIDC Back-Channel Logout configuration. The new method creates an OidcLogoutConfigurer internally and applies default back-channel configuration. Additionally, the deprecated `backChannel(Customizer)` method in OidcLogoutConfigurer has been updated to include the @SInCE tag of 6.5, along with updated documentation recommending the use of the new DSL. Closes spring-projectsgh-15817 Sorry for the delay – I was tied up with company work.
1 parent 1a3c64e commit b0b8a18

File tree

3 files changed

+100
-19
lines changed

3 files changed

+100
-19
lines changed

Diff for: config/src/main/java/org/springframework/security/config/annotation/web/builders/HttpSecurity.java

+51-6
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,18 @@
1616

1717
package org.springframework.security.config.annotation.web.builders;
1818

19-
import jakarta.servlet.*;
19+
import java.io.IOException;
20+
import java.util.ArrayList;
21+
import java.util.List;
22+
import java.util.Map;
23+
24+
import jakarta.servlet.Filter;
25+
import jakarta.servlet.FilterChain;
26+
import jakarta.servlet.ServletException;
27+
import jakarta.servlet.ServletRequest;
28+
import jakarta.servlet.ServletResponse;
2029
import jakarta.servlet.http.HttpServletRequest;
30+
2131
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
2232
import org.springframework.beans.factory.ObjectProvider;
2333
import org.springframework.context.ApplicationContext;
@@ -38,8 +48,29 @@
3848
import org.springframework.security.config.annotation.web.RequestMatcherFactory;
3949
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
4050
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration;
41-
import org.springframework.security.config.annotation.web.configurers.*;
51+
import org.springframework.security.config.annotation.web.configurers.AnonymousConfigurer;
52+
import org.springframework.security.config.annotation.web.configurers.AuthorizeHttpRequestsConfigurer;
4253
import org.springframework.security.config.annotation.web.configurers.AuthorizeHttpRequestsConfigurer.AuthorizationManagerRequestMatcherRegistry;
54+
import org.springframework.security.config.annotation.web.configurers.ChannelSecurityConfigurer;
55+
import org.springframework.security.config.annotation.web.configurers.CorsConfigurer;
56+
import org.springframework.security.config.annotation.web.configurers.CsrfConfigurer;
57+
import org.springframework.security.config.annotation.web.configurers.ExceptionHandlingConfigurer;
58+
import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer;
59+
import org.springframework.security.config.annotation.web.configurers.FormLoginConfigurer;
60+
import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer;
61+
import org.springframework.security.config.annotation.web.configurers.HttpBasicConfigurer;
62+
import org.springframework.security.config.annotation.web.configurers.HttpsRedirectConfigurer;
63+
import org.springframework.security.config.annotation.web.configurers.JeeConfigurer;
64+
import org.springframework.security.config.annotation.web.configurers.LogoutConfigurer;
65+
import org.springframework.security.config.annotation.web.configurers.PasswordManagementConfigurer;
66+
import org.springframework.security.config.annotation.web.configurers.PortMapperConfigurer;
67+
import org.springframework.security.config.annotation.web.configurers.RememberMeConfigurer;
68+
import org.springframework.security.config.annotation.web.configurers.RequestCacheConfigurer;
69+
import org.springframework.security.config.annotation.web.configurers.SecurityContextConfigurer;
70+
import org.springframework.security.config.annotation.web.configurers.ServletApiConfigurer;
71+
import org.springframework.security.config.annotation.web.configurers.SessionManagementConfigurer;
72+
import org.springframework.security.config.annotation.web.configurers.WebAuthnConfigurer;
73+
import org.springframework.security.config.annotation.web.configurers.X509Configurer;
4374
import org.springframework.security.config.annotation.web.configurers.oauth2.client.OAuth2ClientConfigurer;
4475
import org.springframework.security.config.annotation.web.configurers.oauth2.client.OAuth2LoginConfigurer;
4576
import org.springframework.security.config.annotation.web.configurers.oauth2.client.OidcLogoutConfigurer;
@@ -72,10 +103,6 @@
72103
import org.springframework.web.filter.CorsFilter;
73104
import org.springframework.web.servlet.handler.HandlerMappingIntrospector;
74105

75-
import java.io.IOException;
76-
import java.util.ArrayList;
77-
import java.util.List;
78-
import java.util.Map;
79106

80107
/**
81108
* A {@link HttpSecurity} is similar to Spring Security's XML &lt;http&gt; element in the
@@ -2844,6 +2871,24 @@ public HttpSecurity oidcLogout(Customizer<OidcLogoutConfigurer<HttpSecurity>> oi
28442871
return HttpSecurity.this;
28452872
}
28462873

2874+
/**
2875+
* Configures OpenID Connect (OIDC) Back-Channel Logout support.
2876+
*
2877+
* <p>This method enables the configuration of OIDC Back-Channel Logout by applying
2878+
* the provided {@link Customizer} to an instance of {@link OidcLogoutConfigurer}. It
2879+
* initializes the back-channel logout support with default settings, making it easier
2880+
* to integrate with other logout configurations.
2881+
*
2882+
* <p>For example, to enable OIDC Back-Channel Logout with default settings:
2883+
* <pre>
2884+
* http.oidcBackChannelLogout(Customizer.withDefaults());
2885+
* </pre>
2886+
*
2887+
* @param oidcBackChannelLogoutCustomizer the customizer to configure OIDC Back-Channel Logout options
2888+
* @return the {@code HttpSecurity} instance for further customizations
2889+
* @throws Exception if an error occurs during configuration
2890+
* @since 6.5
2891+
*/
28472892
public HttpSecurity oidcBackChannelLogout(Customizer<OidcLogoutConfigurer<HttpSecurity>> oidcBackChannelLogoutCustomizer)
28482893
throws Exception {
28492894
oidcBackChannelLogoutCustomizer.customize(

Diff for: config/src/main/java/org/springframework/security/config/annotation/web/configurers/oauth2/client/OidcLogoutConfigurer.java

+30-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ public OidcLogoutConfigurer<B> oidcSessionRegistry(OidcSessionRegistry oidcSessi
104104
* @deprecated For removal in a future release. Use
105105
* {@link HttpSecurity#oidcBackChannelLogout(Customizer)} instead.
106106
*/
107-
@Deprecated(since = "6.2", forRemoval = true)
107+
@Deprecated(since = "6.5", forRemoval = true)
108108
public OidcLogoutConfigurer<B> backChannel(Customizer<BackChannelLogoutConfigurer> backChannelLogoutConfigurer) {
109109
if (this.backChannel == null) {
110110
this.backChannel = new BackChannelLogoutConfigurer();
@@ -159,6 +159,35 @@ private LogoutHandler logoutHandler(B http) {
159159
return logoutHandler;
160160
}
161161

162+
/**
163+
* Use this endpoint when invoking a back-channel logout.
164+
*
165+
* <p>
166+
* The resulting {@link LogoutHandler} will {@code POST} the session cookie and
167+
* CSRF token to this endpoint to invalidate the corresponding end-user session.
168+
*
169+
* <p>
170+
* Supports URI templates like {@code {baseUrl}}, {@code {baseScheme}}, and
171+
* {@code {basePort}}.
172+
*
173+
* <p>
174+
* By default, the URI is set to
175+
* {@code {baseScheme}://localhost{basePort}/logout}, meaning that the scheme and
176+
* port of the original back-channel request is preserved, while the host and
177+
* endpoint are changed.
178+
*
179+
* <p>
180+
* If you are using Spring Security for the logout endpoint, the path part of this
181+
* URI should match the value configured there.
182+
*
183+
* <p>
184+
* Otherwise, this is handy in the event that your server configuration means that
185+
* the scheme, server name, or port in the {@code Host} header are different from
186+
* how you would address the same server internally.
187+
* @param logoutUri the URI to request logout on the back-channel
188+
* @return the {@link BackChannelLogoutConfigurer} for further customizations
189+
* @since 6.2.4
190+
*/
162191
public BackChannelLogoutConfigurer logoutUri(String logoutUri) {
163192
this.logoutHandler = (http) -> {
164193
OidcBackChannelLogoutHandler logoutHandler = new OidcBackChannelLogoutHandler(

Diff for: config/src/test/java/org/springframework/security/config/annotation/web/configurers/oauth2/client/OidcLogoutConfigurerTests.java

+19-12
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,16 @@
1616

1717
package org.springframework.security.config.annotation.web.configurers.oauth2.client;
1818

19+
import java.io.IOException;
20+
import java.security.KeyPair;
21+
import java.security.KeyPairGenerator;
22+
import java.security.interfaces.RSAPublicKey;
23+
import java.time.Instant;
24+
import java.util.List;
25+
import java.util.Map;
26+
import java.util.concurrent.ConcurrentHashMap;
27+
import java.util.function.Consumer;
28+
1929
import com.nimbusds.jose.jwk.JWKSet;
2030
import com.nimbusds.jose.jwk.RSAKey;
2131
import com.nimbusds.jose.jwk.source.ImmutableJWKSet;
@@ -34,6 +44,7 @@
3444
import org.htmlunit.util.UrlUtils;
3545
import org.junit.jupiter.api.Test;
3646
import org.junit.jupiter.api.extension.ExtendWith;
47+
3748
import org.springframework.beans.factory.ObjectProvider;
3849
import org.springframework.beans.factory.annotation.Autowired;
3950
import org.springframework.context.annotation.Bean;
@@ -64,7 +75,11 @@
6475
import org.springframework.security.oauth2.core.oidc.TestOidcIdTokens;
6576
import org.springframework.security.oauth2.core.oidc.user.OidcUser;
6677
import org.springframework.security.oauth2.jose.jws.SignatureAlgorithm;
67-
import org.springframework.security.oauth2.jwt.*;
78+
import org.springframework.security.oauth2.jwt.JwsHeader;
79+
import org.springframework.security.oauth2.jwt.JwtClaimsSet;
80+
import org.springframework.security.oauth2.jwt.JwtEncoder;
81+
import org.springframework.security.oauth2.jwt.JwtEncoderParameters;
82+
import org.springframework.security.oauth2.jwt.NimbusJwtEncoder;
6883
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
6984
import org.springframework.security.web.SecurityFilterChain;
7085
import org.springframework.security.web.authentication.logout.LogoutHandler;
@@ -77,22 +92,14 @@
7792
import org.springframework.web.bind.annotation.RestController;
7893
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
7994

80-
import java.io.IOException;
81-
import java.security.KeyPair;
82-
import java.security.KeyPairGenerator;
83-
import java.security.interfaces.RSAPublicKey;
84-
import java.time.Instant;
85-
import java.util.List;
86-
import java.util.Map;
87-
import java.util.concurrent.ConcurrentHashMap;
88-
import java.util.function.Consumer;
89-
9095
import static org.assertj.core.api.Assertions.assertThat;
9196
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
9297
import static org.hamcrest.Matchers.containsString;
9398
import static org.mockito.ArgumentMatchers.any;
9499
import static org.mockito.BDDMockito.willThrow;
95-
import static org.mockito.Mockito.*;
100+
import static org.mockito.Mockito.mock;
101+
import static org.mockito.Mockito.spy;
102+
import static org.mockito.Mockito.verify;
96103
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
97104
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.httpBasic;
98105
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;

0 commit comments

Comments
 (0)