在我的自定义EventListenerProvider中使用“onEvent”方法时,我需要将属性“isAfterFirstLogin”设置为“true”,但只会出现异常:java.lang.IllegalStateException:无法在没有事务的情况下访问委托
我正在尝试使用 KeycloakTransactionManager transactionManager = session.getTransactionManager(); transactionManager.begin(); transactionManager.commit(); 和 KeycloakModelUtils.runJobInTransaction
但没有成功(同样的异常)。获取属性映射并手动放置属性不会有帮助,因为更改不会被持久化,并且会在用户会话关闭后重置。
该问题是否有任何解决方法或任何其他处理方法?
钥匙斗篷版本:23.0.5
对我来说,以下工作可以设置属性
public MyEventListenerProvider(KeycloakSession keycloakSession) {
this.keycloakSession = keycloakSession;
}
@Override
public void onEvent(Event event) {
log.info(String.format("KeycloakUserEvent:%s:%s", event.getType(), event.getClientId()));
String userId = event.getUserId();
EventType eventType = event.getType();
if (userId != null) {
RealmModel realm = keycloakSession.realms().getRealm(event.getRealmId());
UserModel user = keycloakSession.users().getUserById(realm, userId);
if (user != null) {
switch (eventType) {
....
case LOGIN:
try {
setUserTimeStamp(user, "lastLoginTimestamp");
handled = true;
} catch (DateTimeException ex) {
log.error("setUserTimeStamp: ", ex);
}
break;
}
}
}
private void setUserTimeStamp(UserModel user, String timestampName) {
user.setSingleAttribute(timestampName, ZonedDateTime.now(ZoneOffset.UTC).format(DateTimeFormatter.ISO_INSTANT));
}