|
@@ -16,7 +16,6 @@
|
|
package org.springframework.security.oauth2.client.oidc.userinfo;
|
|
package org.springframework.security.oauth2.client.oidc.userinfo;
|
|
|
|
|
|
import java.time.Instant;
|
|
import java.time.Instant;
|
|
-import java.util.Arrays;
|
|
|
|
import java.util.Collections;
|
|
import java.util.Collections;
|
|
import java.util.HashMap;
|
|
import java.util.HashMap;
|
|
import java.util.Iterator;
|
|
import java.util.Iterator;
|
|
@@ -33,19 +32,14 @@ import org.junit.Rule;
|
|
import org.junit.Test;
|
|
import org.junit.Test;
|
|
import org.junit.rules.ExpectedException;
|
|
import org.junit.rules.ExpectedException;
|
|
|
|
|
|
-import org.springframework.core.ParameterizedTypeReference;
|
|
|
|
import org.springframework.core.convert.converter.Converter;
|
|
import org.springframework.core.convert.converter.Converter;
|
|
import org.springframework.http.HttpHeaders;
|
|
import org.springframework.http.HttpHeaders;
|
|
import org.springframework.http.HttpMethod;
|
|
import org.springframework.http.HttpMethod;
|
|
-import org.springframework.http.HttpStatus;
|
|
|
|
import org.springframework.http.MediaType;
|
|
import org.springframework.http.MediaType;
|
|
-import org.springframework.http.RequestEntity;
|
|
|
|
-import org.springframework.http.ResponseEntity;
|
|
|
|
import org.springframework.security.core.GrantedAuthority;
|
|
import org.springframework.security.core.GrantedAuthority;
|
|
import org.springframework.security.core.authority.SimpleGrantedAuthority;
|
|
import org.springframework.security.core.authority.SimpleGrantedAuthority;
|
|
import org.springframework.security.oauth2.client.registration.ClientRegistration;
|
|
import org.springframework.security.oauth2.client.registration.ClientRegistration;
|
|
import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService;
|
|
import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService;
|
|
-import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest;
|
|
|
|
import org.springframework.security.oauth2.core.AuthenticationMethod;
|
|
import org.springframework.security.oauth2.core.AuthenticationMethod;
|
|
import org.springframework.security.oauth2.core.OAuth2AccessToken;
|
|
import org.springframework.security.oauth2.core.OAuth2AccessToken;
|
|
import org.springframework.security.oauth2.core.OAuth2AuthenticationException;
|
|
import org.springframework.security.oauth2.core.OAuth2AuthenticationException;
|
|
@@ -56,18 +50,16 @@ import org.springframework.security.oauth2.core.oidc.OidcScopes;
|
|
import org.springframework.security.oauth2.core.oidc.StandardClaimNames;
|
|
import org.springframework.security.oauth2.core.oidc.StandardClaimNames;
|
|
import org.springframework.security.oauth2.core.oidc.user.OidcUser;
|
|
import org.springframework.security.oauth2.core.oidc.user.OidcUser;
|
|
import org.springframework.security.oauth2.core.oidc.user.OidcUserAuthority;
|
|
import org.springframework.security.oauth2.core.oidc.user.OidcUserAuthority;
|
|
-import org.springframework.web.client.RestOperations;
|
|
|
|
|
|
|
|
import static org.assertj.core.api.Assertions.assertThat;
|
|
import static org.assertj.core.api.Assertions.assertThat;
|
|
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
|
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
|
import static org.hamcrest.CoreMatchers.containsString;
|
|
import static org.hamcrest.CoreMatchers.containsString;
|
|
-import static org.mockito.Mockito.any;
|
|
|
|
import static org.mockito.Mockito.mock;
|
|
import static org.mockito.Mockito.mock;
|
|
-import static org.mockito.Mockito.nullable;
|
|
|
|
import static org.mockito.Mockito.same;
|
|
import static org.mockito.Mockito.same;
|
|
import static org.mockito.Mockito.verify;
|
|
import static org.mockito.Mockito.verify;
|
|
import static org.mockito.Mockito.when;
|
|
import static org.mockito.Mockito.when;
|
|
import static org.springframework.security.oauth2.client.registration.TestClientRegistrations.clientRegistration;
|
|
import static org.springframework.security.oauth2.client.registration.TestClientRegistrations.clientRegistration;
|
|
|
|
+import static org.springframework.security.oauth2.core.TestOAuth2AccessTokens.noScopes;
|
|
import static org.springframework.security.oauth2.core.TestOAuth2AccessTokens.scopes;
|
|
import static org.springframework.security.oauth2.core.TestOAuth2AccessTokens.scopes;
|
|
import static org.springframework.security.oauth2.core.oidc.TestOidcIdTokens.idToken;
|
|
import static org.springframework.security.oauth2.core.oidc.TestOidcIdTokens.idToken;
|
|
|
|
|
|
@@ -272,7 +264,7 @@ public class OidcUserServiceTests {
|
|
assertThat(user.getUserInfo().getPreferredUsername()).isEqualTo("user1");
|
|
assertThat(user.getUserInfo().getPreferredUsername()).isEqualTo("user1");
|
|
assertThat(user.getUserInfo().getEmail()).isEqualTo("user1@example.com");
|
|
assertThat(user.getUserInfo().getEmail()).isEqualTo("user1@example.com");
|
|
|
|
|
|
- assertThat(user.getAuthorities().size()).isEqualTo(1);
|
|
|
|
|
|
+ assertThat(user.getAuthorities().size()).isEqualTo(3);
|
|
assertThat(user.getAuthorities().iterator().next()).isInstanceOf(OidcUserAuthority.class);
|
|
assertThat(user.getAuthorities().iterator().next()).isInstanceOf(OidcUserAuthority.class);
|
|
OidcUserAuthority userAuthority = (OidcUserAuthority) user.getAuthorities().iterator().next();
|
|
OidcUserAuthority userAuthority = (OidcUserAuthority) user.getAuthorities().iterator().next();
|
|
assertThat(userAuthority.getAuthority()).isEqualTo("ROLE_USER");
|
|
assertThat(userAuthority.getAuthority()).isEqualTo("ROLE_USER");
|
|
@@ -499,15 +491,13 @@ public class OidcUserServiceTests {
|
|
}
|
|
}
|
|
|
|
|
|
@Test
|
|
@Test
|
|
- public void loadUserWhenAttributesContainScopeThenIndividualScopeAuthorities() {
|
|
|
|
|
|
+ public void loadUserWhenTokenContainsScopesThenIndividualScopeAuthorities() {
|
|
Map<String, Object> body = new HashMap<>();
|
|
Map<String, Object> body = new HashMap<>();
|
|
body.put("id", "id");
|
|
body.put("id", "id");
|
|
body.put("sub", "test-subject");
|
|
body.put("sub", "test-subject");
|
|
- body.put("scope", "message:read message:write");
|
|
|
|
OidcUserService userService = new OidcUserService();
|
|
OidcUserService userService = new OidcUserService();
|
|
- userService.setOauth2UserService(withMockResponse(body));
|
|
|
|
- OidcUserRequest request = new OidcUserRequest(clientRegistration().
|
|
|
|
- userInfoUri("uri").build(), scopes("profile"), idToken(body));
|
|
|
|
|
|
+ OidcUserRequest request = new OidcUserRequest(clientRegistration().build(),
|
|
|
|
+ scopes("message:read", "message:write"), idToken(body));
|
|
OidcUser user = userService.loadUser(request);
|
|
OidcUser user = userService.loadUser(request);
|
|
|
|
|
|
assertThat(user.getAuthorities()).hasSize(3);
|
|
assertThat(user.getAuthorities()).hasSize(3);
|
|
@@ -518,34 +508,13 @@ public class OidcUserServiceTests {
|
|
}
|
|
}
|
|
|
|
|
|
@Test
|
|
@Test
|
|
- public void loadUserWhenAttributesContainScpThenIndividualScopeAuthorities() {
|
|
|
|
|
|
+ public void loadUserWhenTokenDoesNotContainScopesThenNoScopeAuthorities() {
|
|
Map<String, Object> body = new HashMap<>();
|
|
Map<String, Object> body = new HashMap<>();
|
|
body.put("id", "id");
|
|
body.put("id", "id");
|
|
body.put("sub", "test-subject");
|
|
body.put("sub", "test-subject");
|
|
- body.put("scp", Arrays.asList("message:read", "message:write"));
|
|
|
|
OidcUserService userService = new OidcUserService();
|
|
OidcUserService userService = new OidcUserService();
|
|
- userService.setOauth2UserService(withMockResponse(body));
|
|
|
|
- OidcUserRequest request = new OidcUserRequest(clientRegistration().
|
|
|
|
- userInfoUri("uri").build(), scopes("profile"), idToken(body));
|
|
|
|
- OidcUser user = userService.loadUser(request);
|
|
|
|
-
|
|
|
|
- assertThat(user.getAuthorities()).hasSize(3);
|
|
|
|
- Iterator<? extends GrantedAuthority> authorities = user.getAuthorities().iterator();
|
|
|
|
- assertThat(authorities.next()).isInstanceOf(OidcUserAuthority.class);
|
|
|
|
- assertThat(authorities.next()).isEqualTo(new SimpleGrantedAuthority("SCOPE_message:read"));
|
|
|
|
- assertThat(authorities.next()).isEqualTo(new SimpleGrantedAuthority("SCOPE_message:write"));
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- @Test
|
|
|
|
- public void loadUserWhenAttributesDoesNotContainScopesThenNoScopeAuthorities() {
|
|
|
|
- Map<String, Object> body = new HashMap<>();
|
|
|
|
- body.put("id", "id");
|
|
|
|
- body.put("sub", "test-subject");
|
|
|
|
- body.put("authorities", Arrays.asList("message:read", "message:write"));
|
|
|
|
- OidcUserService userService = new OidcUserService();
|
|
|
|
- userService.setOauth2UserService(withMockResponse(body));
|
|
|
|
- OidcUserRequest request = new OidcUserRequest(clientRegistration().
|
|
|
|
- userInfoUri("uri").build(), scopes("profile"), idToken(body));
|
|
|
|
|
|
+ OidcUserRequest request = new OidcUserRequest(clientRegistration().build(),
|
|
|
|
+ noScopes(), idToken(body));
|
|
OidcUser user = userService.loadUser(request);
|
|
OidcUser user = userService.loadUser(request);
|
|
|
|
|
|
assertThat(user.getAuthorities()).hasSize(1);
|
|
assertThat(user.getAuthorities()).hasSize(1);
|
|
@@ -553,18 +522,6 @@ public class OidcUserServiceTests {
|
|
assertThat(authorities.next()).isInstanceOf(OidcUserAuthority.class);
|
|
assertThat(authorities.next()).isInstanceOf(OidcUserAuthority.class);
|
|
}
|
|
}
|
|
|
|
|
|
- private DefaultOAuth2UserService withMockResponse(Map<String, Object> response) {
|
|
|
|
- ResponseEntity<Map<String, Object>> responseEntity = new ResponseEntity<>(response, HttpStatus.OK);
|
|
|
|
- Converter<OAuth2UserRequest, RequestEntity<?>> requestEntityConverter = mock(Converter.class);
|
|
|
|
- RestOperations rest = mock(RestOperations.class);
|
|
|
|
- when(rest.exchange(nullable(RequestEntity.class), any(ParameterizedTypeReference.class)))
|
|
|
|
- .thenReturn(responseEntity);
|
|
|
|
- DefaultOAuth2UserService userService = new DefaultOAuth2UserService();
|
|
|
|
- userService.setRequestEntityConverter(requestEntityConverter);
|
|
|
|
- userService.setRestOperations(rest);
|
|
|
|
- return userService;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
private MockResponse jsonResponse(String json) {
|
|
private MockResponse jsonResponse(String json) {
|
|
return new MockResponse()
|
|
return new MockResponse()
|
|
.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
|
|
.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
|