Skip to content

Commit e410a76

Browse files
ahus1martin-kanis
authored andcommitted
Avoid caching the list of clientscopes in two places
Closes keycloak#20426 Co-authored-by: Martin Kanis <[email protected]>
1 parent c998193 commit e410a76

File tree

3 files changed

+32
-13
lines changed

3 files changed

+32
-13
lines changed

model/infinispan/src/main/java/org/keycloak/models/cache/infinispan/RealmAdapter.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1454,13 +1454,7 @@ public boolean removeGroup(GroupModel group) {
14541454
@Override
14551455
public Stream<ClientScopeModel> getClientScopesStream() {
14561456
if (isUpdated()) return updated.getClientScopesStream();
1457-
return cached.getClientScopes().stream().map(scope -> {
1458-
ClientScopeModel model = cacheSession.getClientScopeById(this, scope);
1459-
if (model == null) {
1460-
throw new IllegalStateException("Cached clientScope not found: " + scope);
1461-
}
1462-
return model;
1463-
});
1457+
return cacheSession.getClientScopesStream(this);
14641458
}
14651459

14661460
@Override

model/infinispan/src/main/java/org/keycloak/models/cache/infinispan/entities/CachedRealm.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,6 @@ public Set<IdentityProviderMapperModel> getIdentityProviderMapperSet() {
159159
}
160160

161161
protected List<String> defaultGroups;
162-
protected List<String> clientScopes = new LinkedList<>();
163162
protected List<String> defaultDefaultClientScopes = new LinkedList<>();
164163
protected List<String> optionalDefaultClientScopes = new LinkedList<>();
165164
protected boolean internationalizationEnabled;
@@ -319,7 +318,6 @@ public CachedRealm(Long revision, RealmModel model) {
319318
}
320319

321320
protected void cacheClientScopes(RealmModel model) {
322-
clientScopes = model.getClientScopesStream().map(ClientScopeModel::getId).collect(Collectors.toList());
323321
defaultDefaultClientScopes = model.getDefaultClientScopesStream(true).map(ClientScopeModel::getId)
324322
.collect(Collectors.toList());
325323
optionalDefaultClientScopes = model.getDefaultClientScopesStream(false).map(ClientScopeModel::getId)
@@ -687,10 +685,6 @@ public List<String> getDefaultGroups() {
687685
return defaultGroups;
688686
}
689687

690-
public List<String> getClientScopes() {
691-
return clientScopes;
692-
}
693-
694688
public List<String> getDefaultDefaultClientScopes() {
695689
return defaultDefaultClientScopes;
696690
}

testsuite/model/src/test/java/org/keycloak/testsuite/model/clientscope/ClientScopeModelTest.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717
package org.keycloak.testsuite.model.clientscope;
1818

19+
import org.hamcrest.Matchers;
1920
import org.keycloak.models.ClientModel;
2021
import org.keycloak.models.ClientProvider;
2122
import org.keycloak.models.ClientScopeModel;
@@ -25,6 +26,7 @@
2526
import org.keycloak.models.RealmModel;
2627
import org.keycloak.models.RealmProvider;
2728
import org.keycloak.models.RoleProvider;
29+
import org.keycloak.models.cache.CacheRealmProvider;
2830
import org.keycloak.testsuite.model.KeycloakModelTest;
2931
import org.keycloak.testsuite.model.RequireProvider;
3032
import java.util.LinkedList;
@@ -97,4 +99,33 @@ public void testClientScopes() {
9799
return null;
98100
});
99101
}
102+
103+
@Test
104+
@RequireProvider(value=ClientScopeProvider.class, only="jpa")
105+
@RequireProvider(value=CacheRealmProvider.class)
106+
public void testClientScopesCaching() {
107+
List<String> clientScopes = new LinkedList<>();
108+
withRealm(realmId, (session, realm) -> {
109+
ClientScopeModel clientScope = session.clientScopes().addClientScope(realm, "myClientScopeForCaching");
110+
clientScopes.add(clientScope.getId());
111+
112+
assertionsForClientScopesCaching(clientScopes, session, realm);
113+
return null;
114+
});
115+
116+
withRealm(realmId, (session, realm) -> {
117+
assertionsForClientScopesCaching(clientScopes, session, realm);
118+
return null;
119+
});
120+
121+
}
122+
123+
private static void assertionsForClientScopesCaching(List<String> clientScopes, KeycloakSession session, RealmModel realm) {
124+
assertThat(clientScopes, Matchers.containsInAnyOrder(realm.getClientScopesStream()
125+
.map(ClientScopeModel::getId).toArray(String[]::new)));
126+
127+
assertThat(clientScopes, Matchers.containsInAnyOrder(session.clientScopes().getClientScopesStream(realm)
128+
.map(ClientScopeModel::getId).toArray(String[]::new)));
129+
}
130+
100131
}

0 commit comments

Comments
 (0)