Skip to content

Commit e4505ed

Browse files
MPriessjzheaux
authored andcommitted
Add placeholders to post_logout_redirect_uri
Now supports baseScheme, baseHost, basePort, and basePath in addition to extant baseUrl. Closes gh-11229
1 parent 79c2b87 commit e4505ed

File tree

2 files changed

+52
-3
lines changed

2 files changed

+52
-3
lines changed

oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/oidc/web/logout/OidcClientInitiatedLogoutSuccessHandler.java

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,19 @@ private String postLogoutRedirectUri(HttpServletRequest request, ClientRegistrat
103103
.build();
104104

105105
Map<String, String> uriVariables = new HashMap<>();
106+
String scheme = uriComponents.getScheme();
107+
uriVariables.put("baseScheme", (scheme != null) ? scheme : "");
106108
uriVariables.put("baseUrl", uriComponents.toUriString());
109+
110+
String host = uriComponents.getHost();
111+
uriVariables.put("baseHost", (host != null) ? host : "");
112+
113+
String path = uriComponents.getPath();
114+
uriVariables.put("basePath", (path != null) ? path : "");
115+
116+
int port = uriComponents.getPort();
117+
uriVariables.put("basePort", (port == -1) ? "" : ":" + port);
118+
107119
uriVariables.put("registrationId", clientRegistration.getRegistrationId());
108120

109121
return UriComponentsBuilder.fromUriString(this.postLogoutRedirectUri)
@@ -138,8 +150,15 @@ public void setPostLogoutRedirectUri(URI postLogoutRedirectUri) {
138150
}
139151

140152
/**
141-
* Set the post logout redirect uri template to use. Supports the {@code "{baseUrl}"}
142-
* placeholder, for example:
153+
* Set the post logout redirect uri template.
154+
*
155+
* <br />
156+
* The supported uri template variables are: {@code {baseScheme}}, {@code {baseHost}},
157+
* {@code {basePort}} and {@code {basePath}}.
158+
*
159+
* <br />
160+
* <b>NOTE:</b> {@code "{baseUrl}"} is also supported, which is the same as
161+
* {@code "{baseScheme}://{baseHost}{basePort}{basePath}"}
143162
*
144163
* <pre>
145164
* handler.setPostLogoutRedirectUri("{baseUrl}");

oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/oidc/web/logout/OidcClientInitiatedLogoutSuccessHandlerTests.java

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ public void logoutWhenUsingPostLogoutRedirectUriThenIncludesItInRedirect() throw
124124
}
125125

126126
@Test
127-
public void logoutWhenUsingPostLogoutRedirectUriTemplateThenBuildsItForRedirect()
127+
public void logoutWhenUsingPostLogoutBaseUrlRedirectUriTemplateThenBuildsItForRedirect()
128128
throws IOException, ServletException {
129129
OAuth2AuthenticationToken token = new OAuth2AuthenticationToken(TestOidcUsers.create(),
130130
AuthorityUtils.NO_AUTHORITIES, this.registration.getRegistrationId());
@@ -138,6 +138,36 @@ public void logoutWhenUsingPostLogoutRedirectUriTemplateThenBuildsItForRedirect(
138138
"https://endpoint?" + "id_token_hint=id-token&" + "post_logout_redirect_uri=https://rp.example.org");
139139
}
140140

141+
@Test
142+
public void logoutWhenUsingPostLogoutRedirectUriTemplateThenBuildsItForRedirect()
143+
throws IOException, ServletException {
144+
OAuth2AuthenticationToken token = new OAuth2AuthenticationToken(TestOidcUsers.create(),
145+
AuthorityUtils.NO_AUTHORITIES, this.registration.getRegistrationId());
146+
this.handler.setPostLogoutRedirectUri("{baseScheme}://{baseHost}{basePort}{basePath}");
147+
this.request.setScheme("https");
148+
this.request.setServerPort(443);
149+
this.request.setServerName("rp.example.org");
150+
this.request.setUserPrincipal(token);
151+
this.handler.onLogoutSuccess(this.request, this.response, token);
152+
assertThat(this.response.getRedirectedUrl()).isEqualTo(
153+
"https://endpoint?" + "id_token_hint=id-token&" + "post_logout_redirect_uri=https://rp.example.org");
154+
}
155+
156+
@Test
157+
public void logoutWhenUsingPostLogoutRedirectUriTemplateWithOtherPortThenBuildsItForRedirect()
158+
throws IOException, ServletException {
159+
OAuth2AuthenticationToken token = new OAuth2AuthenticationToken(TestOidcUsers.create(),
160+
AuthorityUtils.NO_AUTHORITIES, this.registration.getRegistrationId());
161+
this.handler.setPostLogoutRedirectUri("{baseScheme}://{baseHost}{basePort}{basePath}");
162+
this.request.setScheme("https");
163+
this.request.setServerPort(400);
164+
this.request.setServerName("rp.example.org");
165+
this.request.setUserPrincipal(token);
166+
this.handler.onLogoutSuccess(this.request, this.response, token);
167+
assertThat(this.response.getRedirectedUrl()).isEqualTo("https://endpoint?" + "id_token_hint=id-token&"
168+
+ "post_logout_redirect_uri=https://rp.example.org:400");
169+
}
170+
141171
@Test
142172
public void logoutWhenUsingPostLogoutRedirectUriTemplateThenBuildsItForRedirectExpanded()
143173
throws IOException, ServletException {

0 commit comments

Comments
 (0)