我需要实施Keycloak EventListenerProvider 的一些建议,以确保每个用户只有一个脱机会话/令牌(用户在另一台设备上登录后,提供商应确保其他会话/令牌被删除)。我们使用Keycloak 3.4.1。
我希望打个电话
userSessionProvider.removeOfflineUserSession(realmModel, userSession);
在下面的代码中应该足够了...但是它不会删除其中的任何内容 “ OFFLINE_CLIENT_SESSION”和“ OFFLINE_USER_SESSION”表。 我想念什么吗?这甚至可行吗?
@Override
public void onEvent(Event event) {
String realmId = event.getRealmId();
String userId = event.getUserId();
EventType eventType = event.getType();
RealmModel realmModel = realmProvider.getRealm(realmId);
UserModel userModel = session.users().getUserById(userId, realmModel);
UserSessionProvider userSessionProvider = session.sessions();
List<UserSessionModel> userSessions =
userSessionProvider.getOfflineUserSessions(realmModel, userModel);
userSessions.stream()
.filter(userSession ->!userSession.getId().equals(event.getSessionId()))
.forEach(userSession -> {
// The following line does not do anything within the keycloak database...
userSessionProvider.removeOfflineUserSession(realmModel, userSession);
});
}