@Override public int getSessionsCount(KeycloakSession session) { UserSessionPersisterProvider persister = session.getProvider(UserSessionPersisterProvider.class); return persister.getUserSessionsCount(true); }
@Override public void init(KeycloakSession session) { UserSessionPersisterProvider persister = session.getProvider(UserSessionPersisterProvider.class); int startTime = (int)(session.getKeycloakSessionFactory().getServerStartupTimestamp() / 1000); log.debugf("Clearing detached sessions from persistent storage and updating timestamps to %d", startTime); persister.clearDetachedUserSessions(); persister.updateAllTimestamps(startTime); }
protected void sendMessage(KeycloakSession kcSession, Map<String, SessionData> refreshesToSend) { Map<String, Set<String>> sessionIdsByRealm = refreshesToSend.entrySet().stream().collect( Collectors.groupingBy(entry -> entry.getValue().getRealmId(), Collectors.mapping(Map.Entry::getKey, Collectors.toSet()))); // Update DB with a bit lower value than current time to ensure 'revokeRefreshToken' will work correctly taking server int lastSessionRefresh = Time.currentTime() - SessionTimeoutHelper.PERIODIC_TASK_INTERVAL_SECONDS; if (logger.isDebugEnabled()) { logger.debugf("Updating %d userSessions with lastSessionRefresh: %d", refreshesToSend.size(), lastSessionRefresh); } UserSessionPersisterProvider persister = kcSession.getProvider(UserSessionPersisterProvider.class); for (Map.Entry<String, Set<String>> entry : sessionIdsByRealm.entrySet()) { RealmModel realm = kcSession.realms().getRealm(entry.getKey()); // Case when realm was deleted in the meantime. UserSessions were already deleted as well (callback for realm deletion) if (realm == null) { continue; } Set<String> userSessionIds = entry.getValue(); persister.updateLastSessionRefreshes(realm, lastSessionRefresh, userSessionIds, offline); } } }
@Override public boolean loadSessions(KeycloakSession session, int first, int max) { if (log.isTraceEnabled()) { log.tracef("Loading sessions - first: %d, max: %d", first, max); } UserSessionPersisterProvider persister = session.getProvider(UserSessionPersisterProvider.class); List<UserSessionModel> sessions = persister.loadUserSessions(first, max, true); for (UserSessionModel persistentSession : sessions) { // Save to memory/infinispan UserSessionModel offlineUserSession = session.sessions().importUserSession(persistentSession, true); for (ClientSessionModel persistentClientSession : persistentSession.getClientSessions()) { ClientSessionModel offlineClientSession = session.sessions().importClientSession(persistentClientSession, true); offlineClientSession.setUserSession(offlineUserSession); } } return true; }
persister.removeUserSession(s.getId(), true); persister.removeClientSession(s.getId(), true);
private void removeExpiredOfflineClientSessions(RealmModel realm) { UserSessionPersisterProvider persister = session.getProvider(UserSessionPersisterProvider.class); int expiredOffline = Time.currentTime() - realm.getOfflineSessionIdleTimeout(); Iterator<String> itr = offlineSessionCache.entrySet().stream().filter(ClientSessionPredicate.create(realm.getId()).expiredRefresh(expiredOffline)).map(Mappers.sessionId()).iterator(); while (itr.hasNext()) { String sessionId = itr.next(); tx.remove(offlineSessionCache, sessionId); persister.removeClientSession(sessionId, true); } }
private void removeExpiredOfflineUserSessions(RealmModel realm) { UserSessionPersisterProvider persister = session.getProvider(UserSessionPersisterProvider.class); int expiredOffline = Time.currentTime() - realm.getOfflineSessionIdleTimeout(); Iterator<Map.Entry<String, SessionEntity>> itr = offlineSessionCache.entrySet().stream().filter(UserSessionPredicate.create(realm.getId()).expired(null, expiredOffline)).iterator(); while (itr.hasNext()) { UserSessionEntity entity = (UserSessionEntity) itr.next().getValue(); tx.remove(offlineSessionCache, entity.getId()); persister.removeUserSession(entity.getId(), true); for (String clientSessionId : entity.getClientSessions()) { tx.remove(offlineSessionCache, clientSessionId); } } }
@Override public OfflinePersistentWorkerResult loadSessions(KeycloakSession session, OfflinePersistentLoaderContext loaderContext, OfflinePersistentWorkerContext ctx) { int first = ctx.getWorkerId() * sessionsPerSegment; log.tracef("Loading sessions for segment: %d", ctx.getSegment()); UserSessionPersisterProvider persister = session.getProvider(UserSessionPersisterProvider.class); List<UserSessionModel> sessions = persister.loadUserSessions(first, sessionsPerSegment, true, ctx.getLastCreatedOn(), ctx.getLastSessionId()); log.tracef("Sessions loaded from DB - segment: %d", ctx.getSegment()); UserSessionModel lastSession = null; if (!sessions.isEmpty()) { lastSession = sessions.get(sessions.size() - 1); // Save to memory/infinispan session.sessions().importUserSessions(sessions, true); } int lastCreatedOn = lastSession==null ? Time.currentTime() + 100000 : lastSession.getStarted(); String lastSessionId = lastSession==null ? FIRST_SESSION_ID : lastSession.getId(); log.tracef("Sessions imported to infinispan - segment: %d, lastCreatedOn: %d, lastSessionId: %s", ctx.getSegment(), lastCreatedOn, lastSessionId); return new OfflinePersistentWorkerResult(true, ctx.getSegment(), ctx.getWorkerId(), lastCreatedOn, lastSessionId); }
tx.remove(offlineSessionCache, userSessionId); persister.removeUserSession(userSessionId, true); persister.removeClientSession(clientSessionId, true);
@Override public OfflinePersistentLoaderContext computeLoaderContext(KeycloakSession session) { UserSessionPersisterProvider persister = session.getProvider(UserSessionPersisterProvider.class); int sessionsCount = persister.getUserSessionsCount(true); return new OfflinePersistentLoaderContext(sessionsCount, sessionsPerSegment); }