Keycloak - 不调用 UserModelDelegate 设置器

Keycloak - UserModelDelegate setters are not called

我正在使用 Keycloak v4.8.3。

我目前正在尝试使用导入策略实施 UserStorageProvider。我正在关注文档:

https://www.keycloak.org/docs/4.8/server_development/index.html#import-implementation-strategy

这是我的 createAdapter 方法:

   protected UserModel createAdapter(RealmModel realm, String username) {
    UserModel local = session.userLocalStorage().getUserByUsername(username, realm);
    if (local == null) {
        local = session.userLocalStorage().addUser(realm, username);
        local.setFederationLink(model.getId());
        local.setEnabled(true);
        local.setFirstName("test");
        local.setLastName("test");
    }
    return new UserModelDelegate(local) {
        @Override
        public void setUsername(String username) {
            System.out.println(username);
            super.setUsername(username);
        }
        @Override
        public void setEmail(String email) {
            System.out.println(email);
            super.setEmail(email);
        }
    };
}

登录时,将创建用户适配器并将其导入到 keycloak 内部数据库中。当我尝试更改帐户页面上的电子邮件地址时,永远不会调用 setEmail() 方法。 Keycloak 只是更新内部数据库。

我还需要更改外部系统中的电子邮件地址。 我怎样才能使我的外部存储保持同步?

我们当时最终没有实施它,但是当@monzonj 要求它时,我再次调查了这个问题。关键似乎是实现ImportedUserValidation接口

public class CustomUserProvider implements ImportedUserValidation {
    /*ImportedUserValidation*/
    @Override
    public UserModel validate(RealmModel realm, UserModel user) {
        return new CustomUser(user);
    }
}


public class CustomUser extends UserModelDelegate { 
    public CustomUser(UserModel delegate) {
        super(delegate);
    }

    @Override
    public void setFirstName(String firstName) {
        super.setFirstName(firstName);
        // Put your code here...
    }
}

我不确定这样做是否正确,但快速测试表明,当您尝试在帐户管理页面上更改您的名字时,这将调用 setter。

编辑:我们现在使用 keycloak v8.0.2