无法在EventListenerProvider中设置Keycloak用户属性

问题描述 投票:0回答:1

在我的自定义EventListenerProvider中使用“onEvent”方法时,我需要将属性“isAfterFirstLogin”设置为“true”,但只会出现异常:java.lang.IllegalStateException:无法在没有事务的情况下访问委托

我正在尝试使用 KeycloakTransactionManager transactionManager = session.getTransactionManager(); transactionManager.begin(); transactionManager.commit();KeycloakModelUtils.runJobInTransaction

但没有成功(同样的异常)。获取属性映射并手动放置属性不会有帮助,因为更改不会被持久化,并且会在用户会话关闭后重置。

该问题是否有任何解决方法或任何其他处理方法?

钥匙斗篷版本:23.0.5

java keycloak transactionmanager keycloak-spi
1个回答
0
投票

对我来说,以下工作可以设置属性

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));
    }
© www.soinside.com 2019 - 2024. All rights reserved.