diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/DefaultCacheRealmProvider.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/DefaultCacheRealmProvider.java
index 469973f..f73f752 100755
--- a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/DefaultCacheRealmProvider.java
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/DefaultCacheRealmProvider.java
@@ -15,6 +15,7 @@ import org.keycloak.models.cache.entities.CachedRole;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -196,8 +197,16 @@ public class DefaultCacheRealmProvider implements CacheRealmProvider {
@Override
public List<RealmModel> getRealms() {
- // we don't cache this for now
- return getDelegate().getRealms();
+ // Retrieve realms from backend
+ List<RealmModel> backendRealms = getDelegate().getRealms();
+
+ // Return cache delegates to ensure cache invalidated during write operations
+ List<RealmModel> cachedRealms = new LinkedList<RealmModel>();
+ for (RealmModel realm : backendRealms) {
+ RealmModel cached = session.realms().getRealm(realm.getId());
+ cachedRealms.add(cached);
+ }
+ return cachedRealms;
}
@Override
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/model/CacheTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/model/CacheTest.java
index 1237cfa..e16ae05 100755
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/model/CacheTest.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/model/CacheTest.java
@@ -1,5 +1,7 @@
package org.keycloak.testsuite.model;
+import java.util.List;
+
import org.junit.Assert;
import org.junit.ClassRule;
import org.junit.Test;
@@ -32,7 +34,17 @@ public class CacheTest {
{
// update realm, then get an AppModel and change it. The AppModel would not be a cache adapter
KeycloakSession session = kc.startSession();
- RealmModel realm = session.realms().getRealmByName("test");
+
+ // KEYCLOAK-1240 - obtain the realm via session.realms().getRealms()
+ RealmModel realm = null;
+ List<RealmModel> realms = session.realms().getRealms();
+ for (RealmModel current : realms) {
+ if ("test".equals(current.getName())) {
+ realm = current;
+ break;
+ }
+ }
+
Assert.assertTrue(realm instanceof org.keycloak.models.cache.RealmAdapter);
realm.setAccessCodeLifespanLogin(200);
ClientModel testApp = realm.getClientByClientId("test-app");
@@ -44,6 +56,7 @@ public class CacheTest {
{
KeycloakSession session = kc.startSession();
RealmModel realm = session.realms().getRealmByName("test");
+ Assert.assertEquals(200, realm.getAccessCodeLifespanLogin());
ClientModel testApp = session.realms().getClientById(appId, realm);
Assert.assertFalse(testApp.isEnabled());
kc.stopSession(session, true);