keycloak-aplcache

cache settings

7/18/2014 12:30:10 PM

Changes

Details

diff --git a/core/src/main/java/org/keycloak/representations/idm/RealmRepresentation.java b/core/src/main/java/org/keycloak/representations/idm/RealmRepresentation.java
index 6d85877..5a65329 100755
--- a/core/src/main/java/org/keycloak/representations/idm/RealmRepresentation.java
+++ b/core/src/main/java/org/keycloak/representations/idm/RealmRepresentation.java
@@ -27,6 +27,10 @@ public class RealmRepresentation {
     protected Boolean resetPasswordAllowed;
     protected Boolean social;
     protected Boolean updateProfileOnInitialSocialLogin;
+
+    protected Boolean userCacheEnabled;
+    protected Boolean realmCacheEnabled;
+
     //--- brute force settings
     protected Boolean bruteForceProtected;
     protected Integer maxFailureWaitSeconds;
@@ -240,6 +244,22 @@ public class RealmRepresentation {
         this.rememberMe = rememberMe;
     }
 
+    public Boolean isRealmCacheEnabled() {
+        return realmCacheEnabled;
+    }
+
+    public void setRealmCacheEnabled(Boolean realmCacheEnabled) {
+        this.realmCacheEnabled = realmCacheEnabled;
+    }
+
+    public Boolean isUserCacheEnabled() {
+        return userCacheEnabled;
+    }
+
+    public void setUserCacheEnabled(Boolean userCacheEnabled) {
+        this.userCacheEnabled = userCacheEnabled;
+    }
+
     public Boolean isVerifyEmail() {
         return verifyEmail;
     }
diff --git a/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/realm-detail.html b/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/realm-detail.html
index 3b735dd..bfaaa59 100755
--- a/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/realm-detail.html
+++ b/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/realm-detail.html
@@ -80,7 +80,7 @@
                     </div>
                 </fieldset>
                 <fieldset>
-                    <legend><span class="text">Optional Settings</span></legend>
+                    <legend><span class="text">Theme Settings</span></legend>
                     <div class="form-group">
                         <label class="col-sm-2 control-label" for="loginTheme">Login Theme</label>
                         <div class="col-sm-4">
@@ -130,6 +130,21 @@
                         </div>
                     </div>
                 </fieldset>
+                <fieldset>
+                    <legend><span class="text">Cache Settings</span></legend>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label" for="enabled">Realm Cache Enabled</label>
+                        <div class="col-sm-4">
+                            <input ng-model="realm.realmCacheEnabled" name="realmCacheEnabled" id="realmCacheEnabled" onoffswitch />
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label" for="enabled">User Cache Enabled</label>
+                        <div class="col-sm-4">
+                            <input ng-model="realm.userCacheEnabled" name="userCacheEnabled" id="userCacheEnabled" onoffswitch />
+                        </div>
+                    </div>
+                </fieldset>
 
                 <div class="pull-right form-actions" data-ng-show="createRealm && access.manageRealm">
                     <button kc-cancel data-ng-click="cancel()">Cancel</button>
diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/CacheRealmProvider.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/CacheRealmProvider.java
index dc8a75b..8a4c869 100755
--- a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/CacheRealmProvider.java
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/CacheRealmProvider.java
@@ -9,6 +9,9 @@ import org.keycloak.models.RealmProvider;
 public interface CacheRealmProvider extends RealmProvider {
     RealmProvider getDelegate();
 
+    boolean isEnabled();
+    void setEnabled(boolean enabled);
+
     void registerRealmInvalidation(String id);
 
     void registerApplicationInvalidation(String id);
diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/CacheUserProvider.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/CacheUserProvider.java
index 1b63d1e..8a5f68f 100755
--- a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/CacheUserProvider.java
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/CacheUserProvider.java
@@ -9,6 +9,7 @@ import org.keycloak.models.UserProvider;
  */
 public interface CacheUserProvider extends UserProvider {
     UserProvider getDelegate();
-
+    boolean isEnabled();
+    void setEnabled(boolean enabled);
     void registerUserInvalidation(RealmModel realm, String id);
 }
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 c4af844..57f3f90 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
@@ -41,7 +41,6 @@ public class DefaultCacheRealmProvider implements CacheRealmProvider {
     protected Map<String, ApplicationModel> managedApplications = new HashMap<String, ApplicationModel>();
     protected Map<String, OAuthClientModel> managedClients = new HashMap<String, OAuthClientModel>();
     protected Map<String, RoleModel> managedRoles = new HashMap<String, RoleModel>();
-    protected Map<String, UserModel> managedUsers = new HashMap<String, UserModel>();
 
     protected boolean clearAll;
 
@@ -53,6 +52,16 @@ public class DefaultCacheRealmProvider implements CacheRealmProvider {
     }
 
     @Override
+    public boolean isEnabled() {
+        return cache.isEnabled();
+    }
+
+    @Override
+    public void setEnabled(boolean enabled) {
+        cache.setEnabled(enabled);
+    }
+
+    @Override
     public RealmProvider getDelegate() {
         if (!transactionActive) throw new IllegalStateException("Cannot access delegate without a transaction");
         if (delegate != null) return delegate;
@@ -142,6 +151,7 @@ public class DefaultCacheRealmProvider implements CacheRealmProvider {
     @Override
     public RealmModel createRealm(String name) {
         RealmModel realm = getDelegate().createRealm(name);
+        if (!cache.isEnabled()) return realm;
         registerRealmInvalidation(realm.getId());
         return realm;
     }
@@ -149,12 +159,14 @@ public class DefaultCacheRealmProvider implements CacheRealmProvider {
     @Override
     public RealmModel createRealm(String id, String name) {
         RealmModel realm =  getDelegate().createRealm(id, name);
+        if (!cache.isEnabled()) return realm;
         registerRealmInvalidation(realm.getId());
         return realm;
     }
 
     @Override
     public RealmModel getRealm(String id) {
+        if (!cache.isEnabled()) return getDelegate().getRealm(id);
         CachedRealm cached = cache.getCachedRealm(id);
         if (cached == null) {
             RealmModel model = getDelegate().getRealm(id);
@@ -174,6 +186,7 @@ public class DefaultCacheRealmProvider implements CacheRealmProvider {
 
     @Override
     public RealmModel getRealmByName(String name) {
+        if (!cache.isEnabled()) return getDelegate().getRealmByName(name);
         CachedRealm cached = cache.getCachedRealmByName(name);
         if (cached == null) {
             RealmModel model = getDelegate().getRealmByName(name);
@@ -199,6 +212,7 @@ public class DefaultCacheRealmProvider implements CacheRealmProvider {
 
     @Override
     public boolean removeRealm(String id) {
+        if (!cache.isEnabled()) return getDelegate().removeRealm(id);
         cache.invalidateCachedRealmById(id);
 
         RealmModel realm = getDelegate().getRealm(id);
@@ -227,6 +241,7 @@ public class DefaultCacheRealmProvider implements CacheRealmProvider {
 
     @Override
     public RoleModel getRoleById(String id, RealmModel realm) {
+        if (!cache.isEnabled()) return getDelegate().getRoleById(id, realm);
         CachedRole cached = cache.getRole(id);
         if (cached == null) {
             RoleModel model = getDelegate().getRoleById(id, realm);
@@ -251,6 +266,7 @@ public class DefaultCacheRealmProvider implements CacheRealmProvider {
 
     @Override
     public ApplicationModel getApplicationById(String id, RealmModel realm) {
+        if (!cache.isEnabled()) return getDelegate().getApplicationById(id, realm);
         CachedApplication cached = cache.getApplication(id);
         if (cached == null) {
             ApplicationModel model = getDelegate().getApplicationById(id, realm);
@@ -270,6 +286,7 @@ public class DefaultCacheRealmProvider implements CacheRealmProvider {
 
     @Override
     public OAuthClientModel getOAuthClientById(String id, RealmModel realm) {
+        if (!cache.isEnabled()) return getDelegate().getOAuthClientById(id, realm);
         CachedOAuthClient cached = cache.getOAuthClient(id);
         if (cached == null) {
             OAuthClientModel model = getDelegate().getOAuthClientById(id, realm);
diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/DefaultCacheUserProvider.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/DefaultCacheUserProvider.java
index 5817452..c405e02 100755
--- a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/DefaultCacheUserProvider.java
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/DefaultCacheUserProvider.java
@@ -41,6 +41,16 @@ public class DefaultCacheUserProvider implements CacheUserProvider {
     }
 
     @Override
+    public boolean isEnabled() {
+        return cache.isEnabled();
+    }
+
+    @Override
+    public void setEnabled(boolean enabled) {
+        cache.setEnabled(enabled);
+    }
+
+    @Override
     public UserProvider getDelegate() {
         if (!transactionActive) throw new IllegalStateException("Cannot access delegate without a transaction");
         if (delegate != null) return delegate;
@@ -103,6 +113,7 @@ public class DefaultCacheUserProvider implements CacheUserProvider {
 
     @Override
     public UserModel getUserById(String id, RealmModel realm) {
+        if (!cache.isEnabled()) return getDelegate().getUserById(id, realm);
         if (realmInvalidations.contains(realm.getId())) {
             return getDelegate().getUserById(id, realm);
         }
@@ -127,6 +138,7 @@ public class DefaultCacheUserProvider implements CacheUserProvider {
 
     @Override
     public UserModel getUserByUsername(String username, RealmModel realm) {
+        if (!cache.isEnabled()) return getDelegate().getUserByUsername(username, realm);
         if (realmInvalidations.contains(realm.getId())) {
             return getDelegate().getUserByUsername(username, realm);
         }
@@ -149,6 +161,7 @@ public class DefaultCacheUserProvider implements CacheUserProvider {
 
     @Override
     public UserModel getUserByEmail(String email, RealmModel realm) {
+        if (!cache.isEnabled()) return getDelegate().getUserByEmail(email, realm);
         if (realmInvalidations.contains(realm.getId())) {
             return getDelegate().getUserByEmail(email, realm);
         }
@@ -236,6 +249,7 @@ public class DefaultCacheUserProvider implements CacheUserProvider {
 
     @Override
     public boolean removeUser(RealmModel realm, String name) {
+        if (!cache.isEnabled()) return getDelegate().removeUser(realm, name);
         UserModel user = getUserByUsername(name, realm);
         if (user == null) return false;
         registerUserInvalidation(realm, user.getId());
diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/MemoryCacheUserProviderFactory.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/MemoryCacheUserProviderFactory.java
index 340b694..54974b7 100755
--- a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/MemoryCacheUserProviderFactory.java
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/MemoryCacheUserProviderFactory.java
@@ -8,7 +8,7 @@ import org.keycloak.models.KeycloakSession;
  * @version $Revision: 1 $
  */
 public class MemoryCacheUserProviderFactory implements CacheUserProviderFactory {
-    protected UserCache cache = new MemoryUserCache();
+    protected MemoryUserCache cache;
 
     @Override
     public CacheUserProvider create(KeycloakSession session) {
@@ -18,7 +18,9 @@ public class MemoryCacheUserProviderFactory implements CacheUserProviderFactory 
     @Override
     public void init(Config.Scope config) {
         config.get("");
-
+        cache = new MemoryUserCache();
+        int size = config.getInt("maxSize", 10000);
+        cache.setMaxUserCacheSize(size);
     }
 
     @Override
diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/MemoryRealmCache.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/MemoryRealmCache.java
index 00a8b00..2373f9f 100755
--- a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/MemoryRealmCache.java
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/MemoryRealmCache.java
@@ -18,6 +18,7 @@ public class MemoryRealmCache implements RealmCache {
     protected ConcurrentHashMap<String, CachedApplication> applicationCache = new ConcurrentHashMap<String, CachedApplication>();
     protected ConcurrentHashMap<String, CachedOAuthClient> clientCache = new ConcurrentHashMap<String, CachedOAuthClient>();
     protected ConcurrentHashMap<String, CachedRole> roleCache = new ConcurrentHashMap<String, CachedRole>();
+    protected volatile boolean enabled = true;
 
     @Override
     public void clear() {
@@ -29,7 +30,20 @@ public class MemoryRealmCache implements RealmCache {
     }
 
     @Override
+    public boolean isEnabled() {
+        return enabled;
+    }
+
+    @Override
+    public void setEnabled(boolean enabled) {
+        clear();
+        this.enabled = enabled;
+        clear();
+    }
+
+    @Override
     public CachedRealm getCachedRealm(String id) {
+        if (!enabled) return null;
         return realmCache.get(id);
     }
 
@@ -48,6 +62,7 @@ public class MemoryRealmCache implements RealmCache {
 
     @Override
     public void addCachedRealm(CachedRealm realm) {
+        if (!enabled) return;
         realmCache.put(realm.getId(), realm);
         realmCacheByName.put(realm.getName(), realm);
 
@@ -55,11 +70,13 @@ public class MemoryRealmCache implements RealmCache {
 
     @Override
     public CachedRealm getCachedRealmByName(String name) {
+        if (!enabled) return null;
         return realmCacheByName.get(name);
     }
 
     @Override
     public CachedApplication getApplication(String id) {
+        if (!enabled) return null;
         return applicationCache.get(id);
     }
 
@@ -70,6 +87,7 @@ public class MemoryRealmCache implements RealmCache {
 
     @Override
     public void addCachedApplication(CachedApplication app) {
+        if (!enabled) return;
         applicationCache.put(app.getId(), app);
     }
 
@@ -80,6 +98,7 @@ public class MemoryRealmCache implements RealmCache {
 
     @Override
     public CachedOAuthClient getOAuthClient(String id) {
+        if (!enabled) return null;
         return clientCache.get(id);
     }
 
@@ -90,6 +109,7 @@ public class MemoryRealmCache implements RealmCache {
 
     @Override
     public void addCachedOAuthClient(CachedOAuthClient client) {
+        if (!enabled) return;
         clientCache.put(client.getId(), client);
     }
 
@@ -100,6 +120,7 @@ public class MemoryRealmCache implements RealmCache {
 
     @Override
     public CachedRole getRole(String id) {
+        if (!enabled) return null;
         return roleCache.get(id);
     }
 
@@ -115,6 +136,7 @@ public class MemoryRealmCache implements RealmCache {
 
     @Override
     public void addCachedRole(CachedRole role) {
+        if (!enabled) return;
         roleCache.put(role.getId(), role);
     }
 
diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/MemoryUserCache.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/MemoryUserCache.java
index adefff4..360a02d 100755
--- a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/MemoryUserCache.java
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/MemoryUserCache.java
@@ -14,6 +14,7 @@ import java.util.concurrent.ConcurrentHashMap;
 public class MemoryUserCache implements UserCache {
 
     protected int maxUserCacheSize = 10000;
+    protected volatile boolean enabled = true;
 
 
     protected class RealmUsers {
@@ -78,6 +79,18 @@ public class MemoryUserCache implements UserCache {
     }
 
     @Override
+    public boolean isEnabled() {
+        return enabled;
+    }
+
+    @Override
+    public void setEnabled(boolean enabled) {
+        clear();
+        this.enabled = enabled;
+        clear();
+    }
+
+    @Override
     public CachedUser getCachedUser(String realmId, String id) {
         if (realmId == null || id == null) return null;
         RealmUsers users = realmUsers.get(realmId);
diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/NoCacheRealmProvider.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/NoCacheRealmProvider.java
index c4c7131..e704042 100755
--- a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/NoCacheRealmProvider.java
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/NoCacheRealmProvider.java
@@ -16,26 +16,25 @@ import java.util.List;
 public class NoCacheRealmProvider implements CacheRealmProvider {
     protected KeycloakSession session;
     protected RealmProvider delegate;
-//    protected KeycloakTransaction transactionDelegate;
-//    protected boolean transactionActive;
-//    protected boolean setRollbackOnly;
 
     public NoCacheRealmProvider(KeycloakSession session) {
         this.session = session;
     }
 
     @Override
+    public boolean isEnabled() {
+        return false;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    @Override
+    public void setEnabled(boolean enabled) {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    @Override
     public RealmProvider getDelegate() {
-//        if (!transactionActive) throw new IllegalStateException("Cannot access delegate without a transaction");
         if (delegate != null) return delegate;
         delegate = session.getProvider(RealmProvider.class);
-//        transactionDelegate = delegate.getTransaction();
-//        if (!transactionDelegate.isActive()) {
-//            transactionDelegate.begin();
-//            if (setRollbackOnly) {
-//                transactionDelegate.setRollbackOnly();
-//            }
-//        }
         return delegate;
     }
 
diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/NoCacheUserProvider.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/NoCacheUserProvider.java
index 7468f4d..c49fb1f 100755
--- a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/NoCacheUserProvider.java
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/NoCacheUserProvider.java
@@ -25,6 +25,15 @@ public class NoCacheUserProvider implements CacheUserProvider {
     }
 
     @Override
+    public boolean isEnabled() {
+        return false;
+    }
+
+    @Override
+    public void setEnabled(boolean enabled) {
+    }
+
+    @Override
     public UserProvider getDelegate() {
         if (delegate != null) return delegate;
         delegate = session.getProvider(UserProvider.class);
@@ -33,7 +42,6 @@ public class NoCacheUserProvider implements CacheUserProvider {
 
     @Override
     public void registerUserInvalidation(RealmModel realm, String id) {
-        //To change body of implemented methods use File | Settings | File Templates.
     }
 
     @Override
diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/RealmCache.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/RealmCache.java
index 1bb0c3f..246a6ea 100755
--- a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/RealmCache.java
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/RealmCache.java
@@ -49,4 +49,7 @@ public interface RealmCache {
 
     void invalidateRoleById(String id);
 
+    boolean isEnabled();
+
+    void setEnabled(boolean enabled);
 }
diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/UserCache.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/UserCache.java
index 09c7b35..61f1188 100755
--- a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/UserCache.java
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/UserCache.java
@@ -22,4 +22,8 @@ public interface UserCache {
     void invalidateCachedUserById(String realmId, String id);
 
     void invalidateRealmUsers(String realmId);
+
+    boolean isEnabled();
+
+    void setEnabled(boolean enabled);
 }
diff --git a/project-integrations/aerogear-ups/auth-server/src/main/webapp/WEB-INF/classes/META-INF/keycloak-server.json b/project-integrations/aerogear-ups/auth-server/src/main/webapp/WEB-INF/classes/META-INF/keycloak-server.json
index fd02151..6a54eca 100755
--- a/project-integrations/aerogear-ups/auth-server/src/main/webapp/WEB-INF/classes/META-INF/keycloak-server.json
+++ b/project-integrations/aerogear-ups/auth-server/src/main/webapp/WEB-INF/classes/META-INF/keycloak-server.json
@@ -10,16 +10,27 @@
         }
     },
 
-    "model": {
+    "realm": {
         "provider": "jpa"
     },
 
+    "user": {
+        "provider": "${keycloak.user.provider:jpa}"
+    },
+
     "userSessions": {
-        "provider" : "mem"
+        "provider" : "${keycloak.userSessions.provider:mem}"
     },
 
-    "modelCache": {
-        "provider": "${keycloak.model.cache.provider:}"
+    "realmCache": {
+        "provider": "${keycloak.realm.cache.provider:mem}"
+    },
+
+    "userCache": {
+        "provider": "${keycloak.user.cache.provider:mem}",
+        "mem": {
+            "maxSize": 20000
+        }
     },
 
     "timer": {
diff --git a/server/src/main/resources/META-INF/keycloak-server.json b/server/src/main/resources/META-INF/keycloak-server.json
index 7c6d9f8..bc1c102 100755
--- a/server/src/main/resources/META-INF/keycloak-server.json
+++ b/server/src/main/resources/META-INF/keycloak-server.json
@@ -27,7 +27,10 @@
     },
 
     "userCache": {
-        "provider": "${keycloak.user.cache.provider:mem}"
+        "provider": "${keycloak.user.cache.provider:mem}",
+        "mem": {
+            "maxSize": 20000
+        }
     },
 
     "timer": {
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/RealmAdminResource.java b/services/src/main/java/org/keycloak/services/resources/admin/RealmAdminResource.java
index 81e5db1..1a50ffa 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/RealmAdminResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/RealmAdminResource.java
@@ -13,6 +13,8 @@ import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.ModelDuplicateException;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.UserSessionModel;
+import org.keycloak.models.cache.CacheRealmProvider;
+import org.keycloak.models.cache.CacheUserProvider;
 import org.keycloak.models.utils.ModelToRepresentation;
 import org.keycloak.models.utils.RepresentationToModel;
 import org.keycloak.representations.adapters.action.SessionStats;
@@ -114,7 +116,16 @@ public class RealmAdminResource {
     @Produces("application/json")
     public RealmRepresentation getRealm() {
         if (auth.hasView()) {
-            return ModelToRepresentation.toRepresentation(realm);
+            RealmRepresentation rep = ModelToRepresentation.toRepresentation(realm);
+            if (session.realms() instanceof CacheRealmProvider) {
+                CacheRealmProvider cacheRealmProvider = (CacheRealmProvider)session.realms();
+                rep.setRealmCacheEnabled(cacheRealmProvider.isEnabled());
+            }
+            if (session.users() instanceof CacheUserProvider) {
+                CacheUserProvider cache = (CacheUserProvider)session.users();
+                rep.setUserCacheEnabled(cache.isEnabled());
+            }
+            return rep;
         } else {
             auth.requireAny();
 
@@ -140,6 +151,15 @@ public class RealmAdminResource {
         logger.debug("updating realm: " + realm.getName());
         try {
             RepresentationToModel.updateRealm(rep, realm);
+            if (rep.isRealmCacheEnabled() != null && session.realms() instanceof CacheRealmProvider) {
+                CacheRealmProvider cacheRealmProvider = (CacheRealmProvider)session.realms();
+                cacheRealmProvider.setEnabled(rep.isRealmCacheEnabled());
+            }
+            if (rep.isUserCacheEnabled() != null && session.users() instanceof CacheUserProvider) {
+                CacheUserProvider cache = (CacheUserProvider)session.users();
+                cache.setEnabled(rep.isUserCacheEnabled());
+            }
+
             return Response.noContent().build();
         } catch (ModelDuplicateException e) {
             return Flows.errors().exists("Realm " + rep.getRealm() + " already exists");
diff --git a/testsuite/integration/src/main/resources/META-INF/keycloak-server.json b/testsuite/integration/src/main/resources/META-INF/keycloak-server.json
index c5f9677..42e593d 100755
--- a/testsuite/integration/src/main/resources/META-INF/keycloak-server.json
+++ b/testsuite/integration/src/main/resources/META-INF/keycloak-server.json
@@ -24,7 +24,10 @@
     },
 
     "userCache": {
-        "provider": "${keycloak.user.cache.provider:mem}"
+        "provider": "${keycloak.user.cache.provider:mem}",
+        "mem": {
+            "maxSize": 20000
+        }
     },
 
     "timer": {