diff --git a/samples/boot/oauth2login/src/integration-test/java/sample/OAuth2LoginApplicationTests.java b/samples/boot/oauth2login/src/integration-test/java/sample/OAuth2LoginApplicationTests.java
index d9640ff6c1..42984ee7da 100644
--- a/samples/boot/oauth2login/src/integration-test/java/sample/OAuth2LoginApplicationTests.java
+++ b/samples/boot/oauth2login/src/integration-test/java/sample/OAuth2LoginApplicationTests.java
@@ -73,8 +73,7 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
-import static org.springframework.security.oauth2.core.oidc.IdTokenClaimNames.SUB;
-import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.oidcLogin;
+import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.oauth2Login;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model;
@@ -261,12 +260,12 @@ public class OAuth2LoginApplicationTests {
}
@Test
- public void requestWhenMockOidcLoginThenIndex() throws Exception {
+ public void requestWhenMockOAuth2LoginThenIndex() throws Exception {
ClientRegistration clientRegistration = this.clientRegistrationRepository.findByRegistrationId("github");
- this.mvc.perform(get("/").with(oidcLogin().clientRegistration(clientRegistration)))
+ this.mvc.perform(get("/").with(oauth2Login().clientRegistration(clientRegistration)))
.andExpect(model().attribute("userName", "test-subject"))
.andExpect(model().attribute("clientName", "GitHub"))
- .andExpect(model().attribute("userAttributes", Collections.singletonMap(SUB, "test-subject")));
+ .andExpect(model().attribute("userAttributes", Collections.singletonMap("sub", "test-subject")));
}
private void assertLoginPage(HtmlPage page) {
diff --git a/samples/boot/oauth2login/src/test/java/sample/web/OAuth2LoginControllerTests.java b/samples/boot/oauth2login/src/test/java/sample/web/OAuth2LoginControllerTests.java
index d70caa48d4..cd664893ac 100644
--- a/samples/boot/oauth2login/src/test/java/sample/web/OAuth2LoginControllerTests.java
+++ b/samples/boot/oauth2login/src/test/java/sample/web/OAuth2LoginControllerTests.java
@@ -34,8 +34,7 @@ import org.springframework.security.oauth2.core.AuthorizationGrantType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
-import static org.springframework.security.oauth2.core.oidc.IdTokenClaimNames.SUB;
-import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.oidcLogin;
+import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.oauth2Login;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model;
@@ -64,10 +63,10 @@ public class OAuth2LoginControllerTests {
@Test
public void rootWhenAuthenticatedReturnsUserAndClient() throws Exception {
- this.mvc.perform(get("/").with(oidcLogin()))
+ this.mvc.perform(get("/").with(oauth2Login()))
.andExpect(model().attribute("userName", "test-subject"))
.andExpect(model().attribute("clientName", "test"))
- .andExpect(model().attribute("userAttributes", Collections.singletonMap(SUB, "test-subject")));
+ .andExpect(model().attribute("userAttributes", Collections.singletonMap("sub", "test-subject")));
}
@Test
@@ -79,11 +78,11 @@ public class OAuth2LoginControllerTests {
.tokenUri("https://token-uri.example.org")
.build();
- this.mvc.perform(get("/").with(oidcLogin()
+ this.mvc.perform(get("/").with(oauth2Login()
.clientRegistration(clientRegistration)
- .idToken(i -> i.subject("spring-security"))))
+ .attributes(a -> a.put("sub", "spring-security"))))
.andExpect(model().attribute("userName", "spring-security"))
.andExpect(model().attribute("clientName", "my-client-name"))
- .andExpect(model().attribute("userAttributes", Collections.singletonMap(SUB, "spring-security")));
+ .andExpect(model().attribute("userAttributes", Collections.singletonMap("sub", "spring-security")));
}
}
diff --git a/test/src/main/java/org/springframework/security/test/web/servlet/request/SecurityMockMvcRequestPostProcessors.java b/test/src/main/java/org/springframework/security/test/web/servlet/request/SecurityMockMvcRequestPostProcessors.java
index 4e7f0a2a64..854cf09fc9 100644
--- a/test/src/main/java/org/springframework/security/test/web/servlet/request/SecurityMockMvcRequestPostProcessors.java
+++ b/test/src/main/java/org/springframework/security/test/web/servlet/request/SecurityMockMvcRequestPostProcessors.java
@@ -33,6 +33,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;
+import java.util.function.Supplier;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -70,6 +71,9 @@ import org.springframework.security.oauth2.core.oidc.OidcUserInfo;
import org.springframework.security.oauth2.core.oidc.user.DefaultOidcUser;
import org.springframework.security.oauth2.core.oidc.user.OidcUser;
import org.springframework.security.oauth2.core.oidc.user.OidcUserAuthority;
+import org.springframework.security.oauth2.core.user.DefaultOAuth2User;
+import org.springframework.security.oauth2.core.user.OAuth2User;
+import org.springframework.security.oauth2.core.user.OAuth2UserAuthority;
import org.springframework.security.oauth2.jwt.Jwt;
import org.springframework.security.oauth2.server.resource.authentication.BearerTokenAuthentication;
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken;
@@ -371,8 +375,38 @@ public final class SecurityMockMvcRequestPostProcessors {
/**
* Establish a {@link SecurityContext} that has a
* {@link OAuth2AuthenticationToken} for the
- * {@link Authentication} and a {@link OAuth2AuthorizedClient} in
- * the session. All details are
+ * {@link Authentication}, a {@link OAuth2User} as the principal,
+ * and a {@link OAuth2AuthorizedClient} in the session. All details are
+ * declarative and do not require associated tokens to be valid.
+ *
+ *
+ * The support works by associating the authentication to the HttpServletRequest. To associate
+ * the request to the SecurityContextHolder you need to ensure that the
+ * SecurityContextPersistenceFilter is associated with the MockMvc instance. A few
+ * ways to do this are:
+ *
+ *
+ *
+ * - Invoking apply {@link SecurityMockMvcConfigurers#springSecurity()}
+ * - Adding Spring Security's FilterChainProxy to MockMvc
+ * - Manually adding {@link SecurityContextPersistenceFilter} to the MockMvc
+ * instance may make sense when using MockMvcBuilders standaloneSetup
+ *
+ *
+ * @return the {@link OidcLoginRequestPostProcessor} for additional customization
+ * @since 5.3
+ */
+ public static OAuth2LoginRequestPostProcessor oauth2Login() {
+ OAuth2AccessToken accessToken = new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER, "access-token",
+ null, null, Collections.singleton("user"));
+ return new OAuth2LoginRequestPostProcessor(accessToken);
+ }
+
+ /**
+ * Establish a {@link SecurityContext} that has a
+ * {@link OAuth2AuthenticationToken} for the
+ * {@link Authentication}, a {@link OidcUser} as the principal,
+ * and a {@link OAuth2AuthorizedClient} in the session. All details are
* declarative and do not require associated tokens to be valid.
*
*
@@ -1248,6 +1282,147 @@ public final class SecurityMockMvcRequestPostProcessors {
}
}
+ /**
+ * @author Josh Cummings
+ * @since 5.3
+ */
+ public final static class OAuth2LoginRequestPostProcessor implements RequestPostProcessor {
+ private ClientRegistration clientRegistration;
+ private OAuth2AccessToken accessToken;
+
+ private Supplier> authorities = this::defaultAuthorities;
+ private Supplier