default <T> T getAttributeOrDefault(String attribute, T defaultValue) { T value = (T) getAttribute(attribute); if (value == null) { return defaultValue; } return value; }
Set<String> userGroups = (Set<String>) session.getAttribute(UserModel.GROUPS);
private SessionUpdateTask.CrossDCMessageStatus baseChecks(KeycloakSession kcSession, RealmModel realm, boolean offline) { // revokeRefreshToken always writes everything to remoteCache immediately if (realm.isRevokeRefreshToken()) { return SessionUpdateTask.CrossDCMessageStatus.SYNC; } // We're likely not in cross-dc environment. Doesn't matter what we return CrossDCLastSessionRefreshStore storeToUse = offline ? offlineStore : store; if (storeToUse == null) { return SessionUpdateTask.CrossDCMessageStatus.SYNC; } // Received the message from the other DC that we should update the lastSessionRefresh in local cluster Boolean ignoreRemoteCacheUpdate = (Boolean) kcSession.getAttribute(CrossDCLastSessionRefreshListener.IGNORE_REMOTE_CACHE_UPDATE); if (ignoreRemoteCacheUpdate != null && ignoreRemoteCacheUpdate) { return SessionUpdateTask.CrossDCMessageStatus.NOT_NEEDED; } return null; }
public void setLastSessionRefresh(int lastSessionRefresh) { if (offline) { // Received the message from the other DC that we should update the lastSessionRefresh in local cluster. Don't update DB in that case. // The other DC already did. Boolean ignoreRemoteCacheUpdate = (Boolean) session.getAttribute(CrossDCLastSessionRefreshListener.IGNORE_REMOTE_CACHE_UPDATE); if (ignoreRemoteCacheUpdate == null || !ignoreRemoteCacheUpdate) { provider.getPersisterLastSessionRefreshStore().putLastSessionRefresh(session, entity.getId(), realm.getId(), lastSessionRefresh); } } UserSessionUpdateTask task = new UserSessionUpdateTask() { @Override public void runUpdate(UserSessionEntity entity) { entity.setLastSessionRefresh(lastSessionRefresh); } @Override public CrossDCMessageStatus getCrossDCMessageStatus(SessionEntityWrapper<UserSessionEntity> sessionWrapper) { return new CrossDCLastSessionRefreshChecker(provider.getLastSessionRefreshStore(), provider.getOfflineLastSessionRefreshStore()) .shouldSaveUserSessionToRemoteCache(UserSessionAdapter.this.session, UserSessionAdapter.this.realm, sessionWrapper, offline, lastSessionRefresh); } @Override public String toString() { return "setLastSessionRefresh(" + lastSessionRefresh + ')'; } }; update(task); }