Skip to content

Commit 07c4613

Browse files
andreblankejzheaux
authored andcommitted
Add OAuth2AuthenticatedPrincipal.getNameAttributeKey
PR gh-16003
1 parent 31fb7fe commit 07c4613

File tree

11 files changed

+242
-28
lines changed

11 files changed

+242
-28
lines changed

docs/modules/ROOT/pages/reactive/test/web/oauth2.adoc

+2-2
Original file line numberDiff line numberDiff line change
@@ -509,9 +509,9 @@ Java::
509509
[source,java,role="primary"]
510510
----
511511
OAuth2User oauth2User = new DefaultOAuth2User(
512-
AuthorityUtils.createAuthorityList("SCOPE_message:read"),
512+
"foo_user",
513513
Collections.singletonMap("user_name", "foo_user"),
514-
"user_name");
514+
AuthorityUtils.createAuthorityList("SCOPE_message:read"));
515515
516516
client
517517
.mutateWith(mockOAuth2Login().oauth2User(oauth2User))

docs/modules/ROOT/pages/servlet/test/mockmvc/oauth2.adoc

+2-2
Original file line numberDiff line numberDiff line change
@@ -514,9 +514,9 @@ Java::
514514
[source,java,role="primary"]
515515
----
516516
OAuth2User oauth2User = new DefaultOAuth2User(
517-
AuthorityUtils.createAuthorityList("SCOPE_message:read"),
517+
"foo_user",
518518
Collections.singletonMap("user_name", "foo_user"),
519-
"user_name");
519+
AuthorityUtils.createAuthorityList("SCOPE_message:read"));
520520
521521
mvc
522522
.perform(get("/endpoint")

oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/jackson2/DefaultOAuth2UserMixin.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2020 the original author or authors.
2+
* Copyright 2002-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -42,10 +42,16 @@
4242
@JsonIgnoreProperties(ignoreUnknown = true)
4343
abstract class DefaultOAuth2UserMixin {
4444

45+
@Deprecated
4546
@JsonCreator
4647
DefaultOAuth2UserMixin(@JsonProperty("authorities") Collection<? extends GrantedAuthority> authorities,
4748
@JsonProperty("attributes") Map<String, Object> attributes,
4849
@JsonProperty("nameAttributeKey") String nameAttributeKey) {
4950
}
5051

52+
@JsonCreator
53+
DefaultOAuth2UserMixin(@JsonProperty("name") String name,
54+
@JsonProperty("attributes") Map<String, Object> attributes,
55+
@JsonProperty("authorities") Collection<? extends GrantedAuthority> authorities) {
56+
}
5157
}

oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/jackson2/DefaultOidcUserMixin.java

+7
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,17 @@
4343
@JsonIgnoreProperties(value = { "attributes" }, ignoreUnknown = true)
4444
abstract class DefaultOidcUserMixin {
4545

46+
@Deprecated
4647
@JsonCreator
4748
DefaultOidcUserMixin(@JsonProperty("authorities") Collection<? extends GrantedAuthority> authorities,
4849
@JsonProperty("idToken") OidcIdToken idToken, @JsonProperty("userInfo") OidcUserInfo userInfo,
4950
@JsonProperty("nameAttributeKey") String nameAttributeKey) {
5051
}
5152

53+
@JsonCreator
54+
DefaultOidcUserMixin(@JsonProperty("name") String name,
55+
@JsonProperty("idToken") OidcIdToken idToken, @JsonProperty("userInfo") OidcUserInfo userInfo,
56+
@JsonProperty("authorities") Collection<? extends GrantedAuthority> authorities) {
57+
}
58+
5259
}

oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/oidc/userinfo/OidcUserRequestUtils.java

+9-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.security.oauth2.client.oidc.userinfo;
1818

1919
import java.util.LinkedHashSet;
20+
import java.util.Map;
2021
import java.util.Set;
2122

2223
import org.springframework.security.core.GrantedAuthority;
@@ -28,6 +29,7 @@
2829
import org.springframework.security.oauth2.core.oidc.user.DefaultOidcUser;
2930
import org.springframework.security.oauth2.core.oidc.user.OidcUser;
3031
import org.springframework.security.oauth2.core.oidc.user.OidcUserAuthority;
32+
import org.springframework.security.oauth2.core.user.DefaultOAuth2User;
3133
import org.springframework.util.CollectionUtils;
3234
import org.springframework.util.StringUtils;
3335

@@ -90,10 +92,15 @@ static OidcUser getUser(OidcUserRequest userRequest, OidcUserInfo userInfo) {
9092
for (String scope : token.getScopes()) {
9193
authorities.add(new SimpleGrantedAuthority("SCOPE_" + scope));
9294
}
95+
DefaultOidcUser.Builder userBuilder = new DefaultOidcUser.Builder();
9396
if (StringUtils.hasText(userNameAttributeName)) {
94-
return new DefaultOidcUser(authorities, userRequest.getIdToken(), userInfo, userNameAttributeName);
97+
userBuilder.nameAttributeKey(userNameAttributeName);
9598
}
96-
return new DefaultOidcUser(authorities, userRequest.getIdToken(), userInfo);
99+
return userBuilder
100+
.idToken(userRequest.getIdToken())
101+
.userInfo(userInfo)
102+
.authorities(authorities)
103+
.build();
97104
}
98105

99106
private OidcUserRequestUtils() {

oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/userinfo/DefaultOAuth2UserService.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,11 @@ public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2Authentic
9696
OAuth2AccessToken token = userRequest.getAccessToken();
9797
Map<String, Object> attributes = this.attributesConverter.convert(userRequest).convert(response.getBody());
9898
Collection<GrantedAuthority> authorities = getAuthorities(token, attributes, userNameAttributeName);
99-
return new DefaultOAuth2User(authorities, attributes, userNameAttributeName);
99+
return new DefaultOAuth2User.Builder()
100+
.nameAttributeKey(userNameAttributeName)
101+
.attributes(attributes)
102+
.authorities(authorities)
103+
.build();
100104
}
101105

102106
/**

oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/userinfo/DefaultReactiveOAuth2UserService.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,11 @@ public Mono<OAuth2User> loadUser(OAuth2UserRequest userRequest) throws OAuth2Aut
138138
authorities.add(new SimpleGrantedAuthority("SCOPE_" + scope));
139139
}
140140

141-
return new DefaultOAuth2User(authorities, attrs, userNameAttributeName);
141+
return new DefaultOAuth2User.Builder()
142+
.nameAttributeKey(userNameAttributeName)
143+
.attributes(attrs)
144+
.authorities(authorities)
145+
.build();
142146
})
143147
.onErrorMap((ex) -> (ex instanceof UnsupportedMediaTypeException ||
144148
ex.getCause() instanceof UnsupportedMediaTypeException), (ex) -> {

oauth2/oauth2-core/src/main/java/org/springframework/security/oauth2/core/oidc/user/DefaultOidcUser.java

+97
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ public class DefaultOidcUser extends DefaultOAuth2User implements OidcUser {
5555
* @param authorities the authorities granted to the user
5656
* @param idToken the {@link OidcIdToken ID Token} containing claims about the user
5757
*/
58+
@Deprecated
5859
public DefaultOidcUser(Collection<? extends GrantedAuthority> authorities, OidcIdToken idToken) {
5960
this(authorities, idToken, IdTokenClaimNames.SUB);
6061
}
@@ -66,6 +67,7 @@ public DefaultOidcUser(Collection<? extends GrantedAuthority> authorities, OidcI
6667
* @param nameAttributeKey the key used to access the user's &quot;name&quot; from
6768
* {@link #getAttributes()}
6869
*/
70+
@Deprecated
6971
public DefaultOidcUser(Collection<? extends GrantedAuthority> authorities, OidcIdToken idToken,
7072
String nameAttributeKey) {
7173
this(authorities, idToken, null, nameAttributeKey);
@@ -78,6 +80,7 @@ public DefaultOidcUser(Collection<? extends GrantedAuthority> authorities, OidcI
7880
* @param userInfo the {@link OidcUserInfo UserInfo} containing claims about the user,
7981
* may be {@code null}
8082
*/
83+
@Deprecated
8184
public DefaultOidcUser(Collection<? extends GrantedAuthority> authorities, OidcIdToken idToken,
8285
OidcUserInfo userInfo) {
8386
this(authorities, idToken, userInfo, IdTokenClaimNames.SUB);
@@ -92,13 +95,29 @@ public DefaultOidcUser(Collection<? extends GrantedAuthority> authorities, OidcI
9295
* @param nameAttributeKey the key used to access the user's &quot;name&quot; from
9396
* {@link #getAttributes()}
9497
*/
98+
@Deprecated
9599
public DefaultOidcUser(Collection<? extends GrantedAuthority> authorities, OidcIdToken idToken,
96100
OidcUserInfo userInfo, String nameAttributeKey) {
97101
super(authorities, OidcUserAuthority.collectClaims(idToken, userInfo), nameAttributeKey);
98102
this.idToken = idToken;
99103
this.userInfo = userInfo;
100104
}
101105

106+
/**
107+
* Constructs a {@code DefaultOidcUser} using the provided parameters.
108+
* @param name the name of the user
109+
* @param idToken the {@link OidcIdToken ID Token} containing claims about the user
110+
* @param userInfo the {@link OidcUserInfo UserInfo} containing claims about the user,
111+
* may be {@code null}
112+
* @param authorities the authorities granted to the user
113+
*/
114+
public DefaultOidcUser(String name, OidcIdToken idToken, OidcUserInfo userInfo,
115+
Collection<? extends GrantedAuthority> authorities) {
116+
super(name, OidcUserAuthority.collectClaims(idToken, userInfo), authorities);
117+
this.idToken = idToken;
118+
this.userInfo = userInfo;
119+
}
120+
102121
@Override
103122
public Map<String, Object> getClaims() {
104123
return this.getAttributes();
@@ -114,4 +133,82 @@ public OidcUserInfo getUserInfo() {
114133
return this.userInfo;
115134
}
116135

136+
public static class Builder {
137+
138+
private String name;
139+
140+
private String nameAttributeKey;
141+
142+
private OidcIdToken idToken;
143+
144+
private OidcUserInfo userInfo;
145+
146+
private Collection<? extends GrantedAuthority> authorities;
147+
148+
/**
149+
* Sets the name of the user.
150+
* @param name the name of the user
151+
* @return the {@link Builder}
152+
*/
153+
public Builder name(String name) {
154+
this.name = name;
155+
return this;
156+
}
157+
158+
/**
159+
* Sets the key used to access the user's &quot;name&quot; from the user attributes if no &quot;name&quot; is
160+
* provided.
161+
* @param nameAttributeKey the key used to access the user's &quot;name&quot; from the user attributes.
162+
* @return the {@link Builder}
163+
*/
164+
public Builder nameAttributeKey(String nameAttributeKey) {
165+
this.nameAttributeKey = nameAttributeKey;
166+
return this;
167+
}
168+
169+
/**
170+
* Sets the {@link OidcIdToken ID Token} containing claims about the user.
171+
* @param idToken the {@link OidcIdToken ID Token} containing claims about the user.
172+
* @return the {@link Builder}
173+
*/
174+
public Builder idToken(OidcIdToken idToken) {
175+
this.idToken = idToken;
176+
return this;
177+
}
178+
179+
/**
180+
* Sets the {@link OidcUserInfo UserInfo} containing claims about the user.
181+
* @param userInfo the {@link OidcUserInfo UserInfo} containing claims about the user.
182+
* @return the {@link Builder}
183+
*/
184+
public Builder userInfo(OidcUserInfo userInfo) {
185+
this.userInfo = userInfo;
186+
return this;
187+
}
188+
189+
/**
190+
* Sets the authorities granted to the user.
191+
* @param authorities the authorities granted to the user
192+
* @return the {@link Builder}
193+
*/
194+
public Builder authorities(Collection<? extends GrantedAuthority> authorities) {
195+
this.authorities = authorities;
196+
return this;
197+
}
198+
199+
/**
200+
* Builds a new {@link DefaultOidcUser}.
201+
* @return a {@link DefaultOidcUser}
202+
*/
203+
public DefaultOidcUser build() {
204+
String name = this.name;
205+
if (name == null) {
206+
Map<String, Object> attributes = OidcUserAuthority.collectClaims(this.idToken, userInfo);
207+
name = getNameFromAttributes(attributes, this.nameAttributeKey);
208+
}
209+
return new DefaultOidcUser(name, idToken, userInfo, authorities);
210+
}
211+
212+
}
213+
117214
}

0 commit comments

Comments
 (0)