Skip to content

Commit 4f82be7

Browse files
drumoniieleftherias
authored andcommitted
Support URI vars in formLogin and logout MockMvc requests
1 parent 8722a4b commit 4f82be7

File tree

3 files changed

+58
-0
lines changed

3 files changed

+58
-0
lines changed

test/src/main/java/org/springframework/security/test/web/servlet/request/SecurityMockMvcRequestBuilders.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.springframework.test.web.servlet.MockMvc;
2424
import org.springframework.test.web.servlet.RequestBuilder;
2525
import org.springframework.test.web.servlet.request.RequestPostProcessor;
26+
import org.springframework.web.util.UriComponentsBuilder;
2627

2728
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
2829
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
@@ -71,6 +72,8 @@ public static LogoutRequestBuilder logout() {
7172
* Creates a logout request (including any necessary {@link CsrfToken}) to the
7273
* specified {@code logoutUrl}
7374
*
75+
* @param logoutUrl the logout request URL
76+
*
7477
* @return the LogoutRequestBuilder for additional customizations
7578
*/
7679
public static LogoutRequestBuilder logout(String logoutUrl) {
@@ -106,6 +109,19 @@ public LogoutRequestBuilder logoutUrl(String logoutUrl) {
106109
return this;
107110
}
108111

112+
/**
113+
* Specifies the logout URL to POST to.
114+
*
115+
* @param logoutUrl the logout URL to POST to.
116+
* @param uriVars the URI variables
117+
* @return the {@link LogoutRequestBuilder} for additional customizations
118+
*/
119+
public LogoutRequestBuilder logoutUrl(String logoutUrl, Object... uriVars) {
120+
this.logoutUrl = UriComponentsBuilder.fromPath(logoutUrl)
121+
.buildAndExpand(uriVars).encode().toString();
122+
return this;
123+
}
124+
109125
private LogoutRequestBuilder() {
110126
}
111127
}
@@ -146,6 +162,19 @@ public FormLoginRequestBuilder loginProcessingUrl(String loginProcessingUrl) {
146162
return this;
147163
}
148164

165+
/**
166+
* Specifies the URL to POST to.
167+
*
168+
* @param loginProcessingUrl the URL to POST to
169+
* @param uriVars the URI variables
170+
* @return the {@link FormLoginRequestBuilder} for additional customizations
171+
*/
172+
public FormLoginRequestBuilder loginProcessingUrl(String loginProcessingUrl, Object... uriVars) {
173+
this.loginProcessingUrl = UriComponentsBuilder.fromPath(loginProcessingUrl)
174+
.buildAndExpand(uriVars).encode().toString();
175+
return this;
176+
}
177+
149178
/**
150179
* The HTTP parameter to place the username. Default is "username".
151180
* @param usernameParameter the HTTP parameter to place the username. Default is

test/src/test/java/org/springframework/security/test/web/servlet/request/SecurityMockMvcRequestBuildersFormLoginTests.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,22 @@ public void custom() {
6666
assertThat(request.getRequestURI()).isEqualTo("/login");
6767
}
6868

69+
@Test
70+
public void customWithUriVars() {
71+
MockHttpServletRequest request = formLogin().loginProcessingUrl("/uri-login/{var1}/{var2}", "val1", "val2")
72+
.user("username", "admin").password("password", "secret").buildRequest(this.servletContext);
73+
74+
CsrfToken token = (CsrfToken) request
75+
.getAttribute(CsrfRequestPostProcessor.TestCsrfTokenRepository.TOKEN_ATTR_NAME);
76+
77+
assertThat(request.getParameter("username")).isEqualTo("admin");
78+
assertThat(request.getParameter("password")).isEqualTo("secret");
79+
assertThat(request.getMethod()).isEqualTo("POST");
80+
assertThat(request.getParameter(token.getParameterName()))
81+
.isEqualTo(token.getToken());
82+
assertThat(request.getRequestURI()).isEqualTo("/uri-login/val1/val2");
83+
}
84+
6985
// gh-3920
7086
@Test
7187
public void usesAcceptMediaForContentNegotiation() {

test/src/test/java/org/springframework/security/test/web/servlet/request/SecurityMockMvcRequestBuildersFormLogoutTests.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,17 @@ public void custom() {
5858
assertThat(request.getRequestURI()).isEqualTo("/admin/logout");
5959
}
6060

61+
@Test
62+
public void customWithUriVars() {
63+
MockHttpServletRequest request = logout().logoutUrl("/uri-logout/{var1}/{var2}", "val1", "val2").buildRequest(
64+
servletContext);
65+
66+
CsrfToken token = (CsrfToken) request.getAttribute(CsrfRequestPostProcessor.TestCsrfTokenRepository.TOKEN_ATTR_NAME);
67+
68+
assertThat(request.getMethod()).isEqualTo("POST");
69+
assertThat(request.getParameter(token.getParameterName())).isEqualTo(
70+
token.getToken());
71+
assertThat(request.getRequestURI()).isEqualTo("/uri-logout/val1/val2");
72+
}
73+
6174
}

0 commit comments

Comments
 (0)