Restarting an user session broken for persistent sessions

Fixes #43161

Signed-off-by: Pedro Ruivo <1492066+pruivo@users.noreply.github.com>
Co-authored-by: Pedro Ruivo <1492066+pruivo@users.noreply.github.com>
This commit is contained in:
Pedro Ruivo 2025-10-02 20:29:04 +01:00 committed by GitHub
parent f7803ae041
commit 4f24f93b85
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 8 additions and 2 deletions

View File

@ -344,6 +344,9 @@ public class UserSessionAdapter<T extends SessionRefreshStore & UserSessionProvi
@Override
public void restartSession(RealmModel realm, UserModel user, String loginUsername, String ipAddress, String authMethod, boolean rememberMe, String brokerSessionId, String brokerUserId) {
// Sending a delete statement for each client session may have a performance impact.
// The update task will clear the entity.getClientSessions() set.
entity.getClientSessions().forEach(clientUUID -> this.clientSessionUpdateTx.addTask(new EmbeddedClientSessionKey(entity.getId(), clientUUID), Tasks.removeSync(offline)));
UserSessionUpdateTask task = new UserSessionUpdateTask() {
@Override

View File

@ -381,6 +381,7 @@ public class PersistentUserSessionAdapter implements OfflineUserSessionModel {
public void setStarted(int started) {
getData().setStarted(started);
model.setStarted(started);
}
public void setBrokerSessionId(String brokerSessionId) {
@ -466,12 +467,12 @@ public class PersistentUserSessionAdapter implements OfflineUserSessionModel {
this.rememberMe = rememberMe;
}
@Deprecated
@Deprecated(since = "26.5", forRemoval = true)
public int getStarted() {
return started;
}
@Deprecated
@Deprecated(since = "26.5", forRemoval = true)
public void setStarted(int started) {
this.started = started;
}

View File

@ -526,6 +526,7 @@ public class UserSessionProviderTest extends AbstractTestRealmKeycloakTest {
kcSession.getContext().setRealm(r);
r.setSsoSessionMaxLifespanRememberMe(r.getSsoSessionMaxLifespan() * 4);
r.setSsoSessionIdleTimeoutRememberMe(r.getSsoSessionIdleTimeout() * 4);
r.setRememberMe(true);
});
// create an user session with remember-me enabled that is older than the default 'max lifespan' timeout but not older than the 'max lifespan remember-me' timeout.
@ -597,6 +598,7 @@ public class UserSessionProviderTest extends AbstractTestRealmKeycloakTest {
kcSession.getContext().setRealm(r);
r.setSsoSessionMaxLifespanRememberMe(previousMaxLifespan);
r.setSsoSessionIdleTimeoutRememberMe(previousMaxIdle);
r.setRememberMe(false);
});
}
}