如何在Keycloak SPI扩展中编写一个简单的事务包装器?

时间:2019-05-23 09:55:31

标签: transactions keycloak keycloak-services

通过遵循this Keycloak开发人员指南,我试图编写一个SPI扩展,以帮助将自定义用户服务(将其视为具有大量处理用户数据的CRUD REST API的数据存储) 。

我想要实现的一个基本方案是,当新用户通过Keycloak登录时,需要通过创建用户条目将其信息传播到自定义用户服务。

通过实现UserRegistrationProvider接口,我的提供程序中具有以下方法。

    @Override
    public UserModel addUser(RealmModel realm, String username) {
        log.infov("Adding new user: username={0}", username);
        User user = new User();
        // do something to populate the user object with additional attributes, e.g. those edited via the Keycloak console UI
        UserModel userModel = createAdapter(realm, user);
        return userModel;
    }

奇怪的是,此接口方法仅将username参数作为字符串接收。我不知道如何访问其他用户属性。我在此问题下面找到了两个帖子。

UserRegistrationProvider value object add method

Custom federation - webservice

Keycloak团队的答复是,只有在提交事务后,事务包装器才能应用于持久更改。 good example是LDAP联合的正式实现。 this是LDAP事务的源代码。

但是该代码部分太多了,无法阅读。如果有人可以提供一种简单明了的实现方式,请对此表示赞赏。

1 个答案:

答案 0 :(得分:0)

在通读LDAP提供程序上Keycloak的源代码后,我发现数据持久化步骤可以发生在customised transaction中,即在主事务之后的enlisted中。

上面引用的存储库是我尝试过的基于文件的Keycloak用户存储提供程序。希望它可以对此提供一些见解。