keycloak-aplcache
Changes
forms/common-themes/src/main/resources/theme/admin/base/resources/partials/realm-detail.html 17(+16 -1)
model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/CacheRealmProvider.java 3(+3 -0)
model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/CacheUserProvider.java 3(+2 -1)
model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/DefaultCacheRealmProvider.java 19(+18 -1)
model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/DefaultCacheUserProvider.java 14(+14 -0)
model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/MemoryCacheUserProviderFactory.java 6(+4 -2)
model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/MemoryRealmCache.java 22(+22 -0)
model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/MemoryUserCache.java 13(+13 -0)
model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/NoCacheRealmProvider.java 21(+10 -11)
model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/NoCacheUserProvider.java 10(+9 -1)
model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/RealmCache.java 3(+3 -0)
model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/UserCache.java 4(+4 -0)
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": {