Skip to content

Commit 55b1b00

Browse files
committed
Updated relationship between approved sites and access tokens, closes mitreid-connect#874
1 parent d875d52 commit 55b1b00

File tree

11 files changed

+88
-49
lines changed

11 files changed

+88
-49
lines changed

openid-connect-common/src/main/java/org/mitre/oauth2/model/OAuth2AccessTokenEntity.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import javax.persistence.Transient;
4848

4949
import org.mitre.oauth2.model.convert.JWTStringConverter;
50+
import org.mitre.openid.connect.model.ApprovedSite;
5051
import org.mitre.uma.model.Permission;
5152
import org.springframework.security.oauth2.common.OAuth2AccessToken;
5253
import org.springframework.security.oauth2.common.OAuth2AccessTokenJackson1Deserializer;
@@ -70,6 +71,7 @@
7071
@NamedQuery(name = OAuth2AccessTokenEntity.QUERY_BY_CLIENT, query = "select a from OAuth2AccessTokenEntity a where a.client = :" + OAuth2AccessTokenEntity.PARAM_CLIENT),
7172
@NamedQuery(name = OAuth2AccessTokenEntity.QUERY_BY_ID_TOKEN, query = "select a from OAuth2AccessTokenEntity a where a.idToken = :" + OAuth2AccessTokenEntity.PARAM_ID_TOKEN),
7273
@NamedQuery(name = OAuth2AccessTokenEntity.QUERY_BY_TOKEN_VALUE, query = "select a from OAuth2AccessTokenEntity a where a.jwt = :" + OAuth2AccessTokenEntity.PARAM_TOKEN_VALUE),
74+
@NamedQuery(name = OAuth2AccessTokenEntity.QUERY_BY_APPROVED_SITE, query = "select a from OAuth2AccessTokenEntity a where a.approvedSite = :" + OAuth2AccessTokenEntity.PARAM_APPROVED_SITE),
7375
@NamedQuery(name = OAuth2AccessTokenEntity.QUERY_BY_RESOURCE_SET, query = "select a from OAuth2AccessTokenEntity a join a.permissions p where p.resourceSet.id = :" + OAuth2AccessTokenEntity.PARAM_RESOURCE_SET_ID)
7476
})
7577
@org.codehaus.jackson.map.annotate.JsonSerialize(using = OAuth2AccessTokenJackson1Serializer.class)
@@ -78,6 +80,7 @@
7880
@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = OAuth2AccessTokenJackson2Deserializer.class)
7981
public class OAuth2AccessTokenEntity implements OAuth2AccessToken {
8082

83+
public static final String QUERY_BY_APPROVED_SITE = "OAuth2AccessTokenEntity.getByApprovedSite";
8184
public static final String QUERY_BY_TOKEN_VALUE = "OAuth2AccessTokenEntity.getByTokenValue";
8285
public static final String QUERY_BY_ID_TOKEN = "OAuth2AccessTokenEntity.getByIdToken";
8386
public static final String QUERY_BY_CLIENT = "OAuth2AccessTokenEntity.getByClient";
@@ -92,6 +95,7 @@ public class OAuth2AccessTokenEntity implements OAuth2AccessToken {
9295
public static final String PARAM_REFERSH_TOKEN = "refreshToken";
9396
public static final String PARAM_DATE = "date";
9497
public static final String PARAM_RESOURCE_SET_ID = "rsid";
98+
public static final String PARAM_APPROVED_SITE = "approvedSite";
9599

96100
public static final String ID_TOKEN_FIELD_NAME = "id_token";
97101

@@ -114,6 +118,8 @@ public class OAuth2AccessTokenEntity implements OAuth2AccessToken {
114118
private Set<String> scope;
115119

116120
private Set<Permission> permissions;
121+
122+
private ApprovedSite approvedSite;
117123

118124
/**
119125
* Create a new, blank access token
@@ -337,4 +343,13 @@ public void setPermissions(Set<Permission> permissions) {
337343
this.permissions = permissions;
338344
}
339345

346+
@ManyToOne
347+
@JoinColumn(name="approved_site_id")
348+
public ApprovedSite getApprovedSite() {
349+
return approvedSite;
350+
}
351+
352+
public void setApprovedSite(ApprovedSite approvedSite) {
353+
this.approvedSite = approvedSite;
354+
}
340355
}

openid-connect-common/src/main/java/org/mitre/oauth2/repository/OAuth2TokenRepository.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.mitre.oauth2.model.ClientDetailsEntity;
2323
import org.mitre.oauth2.model.OAuth2AccessTokenEntity;
2424
import org.mitre.oauth2.model.OAuth2RefreshTokenEntity;
25+
import org.mitre.openid.connect.model.ApprovedSite;
2526
import org.mitre.uma.model.ResourceSet;
2627

2728
public interface OAuth2TokenRepository {
@@ -65,5 +66,7 @@ public interface OAuth2TokenRepository {
6566
public void clearDuplicateAccessTokens();
6667

6768
public void clearDuplicateRefreshTokens();
69+
70+
public List<OAuth2AccessTokenEntity> getAccessTokensForApprovedSite(ApprovedSite approvedSite);
6871

6972
}

openid-connect-common/src/main/java/org/mitre/openid/connect/model/ApprovedSite.java

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,6 @@ public class ApprovedSite {
8181
// this should include all information for what data to access
8282
private Set<String> allowedScopes;
8383

84-
//Link to any access tokens approved through this stored decision
85-
private Set<OAuth2AccessTokenEntity> approvedAccessTokens = Sets.newHashSet();
86-
8784
/**
8885
* Empty constructor
8986
*/
@@ -229,16 +226,4 @@ public boolean isExpired() {
229226
}
230227
}
231228

232-
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
233-
@JoinColumn(name="approved_site_id")
234-
public Set<OAuth2AccessTokenEntity> getApprovedAccessTokens() {
235-
return approvedAccessTokens;
236-
}
237-
238-
/**
239-
* @param approvedAccessTokens the approvedAccessTokens to set
240-
*/
241-
public void setApprovedAccessTokens(Set<OAuth2AccessTokenEntity> approvedAccessTokens) {
242-
this.approvedAccessTokens = approvedAccessTokens;
243-
}
244229
}

openid-connect-common/src/main/java/org/mitre/openid/connect/service/ApprovedSiteService.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@
1818

1919
import java.util.Collection;
2020
import java.util.Date;
21+
import java.util.List;
2122
import java.util.Set;
2223

24+
import org.mitre.oauth2.model.OAuth2AccessTokenEntity;
2325
import org.mitre.openid.connect.model.ApprovedSite;
2426
import org.springframework.security.oauth2.provider.ClientDetails;
2527

@@ -101,4 +103,11 @@ public interface ApprovedSiteService {
101103
* @return
102104
*/
103105
public void clearExpiredSites();
106+
107+
/**
108+
* Return all approved access tokens for the site.
109+
* @return
110+
*/
111+
public List<OAuth2AccessTokenEntity> getApprovedAccessTokens(ApprovedSite approvedSite);
112+
104113
}

openid-connect-server/src/main/java/org/mitre/oauth2/repository/impl/JpaOAuth2TokenRepository.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.mitre.oauth2.model.OAuth2AccessTokenEntity;
3636
import org.mitre.oauth2.model.OAuth2RefreshTokenEntity;
3737
import org.mitre.oauth2.repository.OAuth2TokenRepository;
38+
import org.mitre.openid.connect.model.ApprovedSite;
3839
import org.mitre.uma.model.ResourceSet;
3940
import org.mitre.util.jpa.JpaUtil;
4041
import org.slf4j.Logger;
@@ -272,5 +273,13 @@ public void clearDuplicateRefreshTokens() {
272273
}
273274

274275
}
276+
277+
@Override
278+
public List<OAuth2AccessTokenEntity> getAccessTokensForApprovedSite(ApprovedSite approvedSite) {
279+
TypedQuery<OAuth2AccessTokenEntity> queryA = manager.createNamedQuery(OAuth2AccessTokenEntity.QUERY_BY_APPROVED_SITE, OAuth2AccessTokenEntity.class);
280+
queryA.setParameter(OAuth2AccessTokenEntity.PARAM_APPROVED_SITE, approvedSite);
281+
List<OAuth2AccessTokenEntity> accessTokens = queryA.getResultList();
282+
return accessTokens;
283+
}
275284

276285
}

openid-connect-server/src/main/java/org/mitre/oauth2/service/impl/DefaultOAuth2ProviderTokenService.java

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -250,24 +250,21 @@ public OAuth2AccessTokenEntity createAccessToken(OAuth2Authentication authentica
250250
token.setRefreshToken(savedRefreshToken);
251251
}
252252

253-
OAuth2AccessTokenEntity enhancedToken = (OAuth2AccessTokenEntity) tokenEnhancer.enhance(token, authentication);
254-
255-
OAuth2AccessTokenEntity savedToken = tokenRepository.saveAccessToken(enhancedToken);
256-
257253
//Add approved site reference, if any
258254
OAuth2Request originalAuthRequest = authHolder.getAuthentication().getOAuth2Request();
259255

260256
if (originalAuthRequest.getExtensions() != null && originalAuthRequest.getExtensions().containsKey("approved_site")) {
261257

262258
Long apId = Long.parseLong((String) originalAuthRequest.getExtensions().get("approved_site"));
263259
ApprovedSite ap = approvedSiteService.getById(apId);
264-
Set<OAuth2AccessTokenEntity> apTokens = ap.getApprovedAccessTokens();
265-
apTokens.add(savedToken);
266-
ap.setApprovedAccessTokens(apTokens);
267-
approvedSiteService.save(ap);
268260

261+
token.setApprovedSite(ap);
269262
}
270263

264+
OAuth2AccessTokenEntity enhancedToken = (OAuth2AccessTokenEntity) tokenEnhancer.enhance(token, authentication);
265+
266+
OAuth2AccessTokenEntity savedToken = tokenRepository.saveAccessToken(enhancedToken);
267+
271268
if (savedToken.getRefreshToken() != null) {
272269
tokenRepository.saveRefreshToken(savedToken.getRefreshToken()); // make sure we save any changes that might have been enhanced
273270
}

openid-connect-server/src/main/java/org/mitre/openid/connect/service/impl/DefaultApprovedSiteService.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.util.Collection;
2020
import java.util.Date;
21+
import java.util.List;
2122
import java.util.Set;
2223

2324
import org.mitre.oauth2.model.OAuth2AccessTokenEntity;
@@ -82,7 +83,7 @@ public ApprovedSite getById(Long id) {
8283
public void remove(ApprovedSite approvedSite) {
8384

8485
//Remove any associated access and refresh tokens
85-
Set<OAuth2AccessTokenEntity> accessTokens = approvedSite.getApprovedAccessTokens();
86+
List<OAuth2AccessTokenEntity> accessTokens = getApprovedAccessTokens(approvedSite);
8687

8788
for (OAuth2AccessTokenEntity token : accessTokens) {
8889
if (token.getRefreshToken() != null) {
@@ -180,4 +181,11 @@ private Collection<ApprovedSite> getExpired() {
180181
return Collections2.filter(approvedSiteRepository.getAll(), isExpired);
181182
}
182183

184+
@Override
185+
public List<OAuth2AccessTokenEntity> getApprovedAccessTokens(
186+
ApprovedSite approvedSite) {
187+
return tokenRepository.getAccessTokensForApprovedSite(approvedSite);
188+
189+
}
190+
183191
}

openid-connect-server/src/main/java/org/mitre/openid/connect/service/impl/MITREidDataService_1_0.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -896,14 +896,17 @@ private void fixObjectReferences() {
896896
whitelistedSiteOldToNewIdMap.clear();
897897
for (Long oldGrantId : grantToAccessTokensRefs.keySet()) {
898898
Set<Long> oldAccessTokenIds = grantToAccessTokensRefs.get(oldGrantId);
899-
Set<OAuth2AccessTokenEntity> tokens = new HashSet<>();
899+
900+
Long newGrantId = grantOldToNewIdMap.get(oldGrantId);
901+
ApprovedSite site = approvedSiteRepository.getById(newGrantId);
902+
900903
for(Long oldTokenId : oldAccessTokenIds) {
901904
Long newTokenId = accessTokenOldToNewIdMap.get(oldTokenId);
902-
tokens.add(tokenRepository.getAccessTokenById(newTokenId));
905+
OAuth2AccessTokenEntity token = tokenRepository.getAccessTokenById(newTokenId);
906+
token.setApprovedSite(site);
907+
tokenRepository.saveAccessToken(token);
903908
}
904-
Long newGrantId = grantOldToNewIdMap.get(oldGrantId);
905-
ApprovedSite site = approvedSiteRepository.getById(newGrantId);
906-
site.setApprovedAccessTokens(tokens);
909+
907910
approvedSiteRepository.save(site);
908911
}
909912
accessTokenOldToNewIdMap.clear();

openid-connect-server/src/main/java/org/mitre/openid/connect/service/impl/MITREidDataService_1_1.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -909,14 +909,17 @@ private void fixObjectReferences() {
909909
accessTokenToIdTokenRefs.clear();
910910
for (Long oldGrantId : grantToAccessTokensRefs.keySet()) {
911911
Set<Long> oldAccessTokenIds = grantToAccessTokensRefs.get(oldGrantId);
912-
Set<OAuth2AccessTokenEntity> tokens = new HashSet<>();
912+
913+
Long newGrantId = grantOldToNewIdMap.get(oldGrantId);
914+
ApprovedSite site = approvedSiteRepository.getById(newGrantId);
915+
913916
for(Long oldTokenId : oldAccessTokenIds) {
914917
Long newTokenId = accessTokenOldToNewIdMap.get(oldTokenId);
915-
tokens.add(tokenRepository.getAccessTokenById(newTokenId));
918+
OAuth2AccessTokenEntity token = tokenRepository.getAccessTokenById(newTokenId);
919+
token.setApprovedSite(site);
920+
tokenRepository.saveAccessToken(token);
916921
}
917-
Long newGrantId = grantOldToNewIdMap.get(oldGrantId);
918-
ApprovedSite site = approvedSiteRepository.getById(newGrantId);
919-
site.setApprovedAccessTokens(tokens);
922+
920923
approvedSiteRepository.save(site);
921924
}
922925
accessTokenOldToNewIdMap.clear();

openid-connect-server/src/main/java/org/mitre/openid/connect/service/impl/MITREidDataService_1_2.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -900,14 +900,17 @@ private void fixObjectReferences() {
900900
accessTokenToIdTokenRefs.clear();
901901
for (Long oldGrantId : grantToAccessTokensRefs.keySet()) {
902902
Set<Long> oldAccessTokenIds = grantToAccessTokensRefs.get(oldGrantId);
903-
Set<OAuth2AccessTokenEntity> tokens = new HashSet<OAuth2AccessTokenEntity>();
903+
904+
Long newGrantId = grantOldToNewIdMap.get(oldGrantId);
905+
ApprovedSite site = approvedSiteRepository.getById(newGrantId);
906+
904907
for(Long oldTokenId : oldAccessTokenIds) {
905908
Long newTokenId = accessTokenOldToNewIdMap.get(oldTokenId);
906-
tokens.add(tokenRepository.getAccessTokenById(newTokenId));
909+
OAuth2AccessTokenEntity token = tokenRepository.getAccessTokenById(newTokenId);
910+
token.setApprovedSite(site);
911+
tokenRepository.saveAccessToken(token);
907912
}
908-
Long newGrantId = grantOldToNewIdMap.get(oldGrantId);
909-
ApprovedSite site = approvedSiteRepository.getById(newGrantId);
910-
site.setApprovedAccessTokens(tokens);
913+
911914
approvedSiteRepository.save(site);
912915
}
913916
accessTokenOldToNewIdMap.clear();

0 commit comments

Comments
 (0)