当前位置: 首页 > 知识库问答 >
问题:

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

袁奇玮
2023-03-14

通过遵循本Keycloak开发人员指南,我试图编写一个SPI扩展,帮助将自定义用户服务(将其视为一个数据存储,其中包含一系列处理用户数据的CRUD REST API)联合到Keycloak中。

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

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

java prettyprint-override">    @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参数作为字符串。我不知道如何访问其他用户属性。我发现下面两个关于这个问题的帖子。

但是代码部分太多了,无法阅读。如果有人能提供一种简单明了的方法来实现它,我将不胜感激。

共有1个答案

杨波娃
2023-03-14

在阅读了KeyCloak在LDAP provider上的源代码后,我发现数据持久化步骤可以发生在主事务之后登记的定制事务中。

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

 类似资料:
  • This section is intended as a walkthrough for the creation of custom extensions. It covers the basics of writing and activating an extensions, as well as commonly used features of extensions. As an ex

  • 如果中间包是空的,Intellij IDEA会自动将包链在一起。总的来说,这是一个很好的特性。但是,有时您不希望它们被链接起来,特别是当您正在为您的新项目创建新包结构时。我可能遇到了为某个包禁用此功能的设置,但我现在找不到了。那么,有没有人知道如何控制这个特性呢?非常感谢。 顺便说一句,如果您需要澄清,我所说的包链接的意思如下。假设您有这样的包结构: 在project explorer中,看起来包

  • 问题内容: 安装模块和程序后,我需要运行一个简单的脚本。我很难找到有关如何执行此操作的直接文档。看来我需要从distutils.command.install继承,重写一些方法,然后将此对象添加到安装脚本中。虽然细节有些模糊,但是对于这样一个简单的钩子似乎需要付出很多努力。有人知道这样做的简单方法吗? 问题答案: 我花了一天时间浏览distutils源码,以了解足够的知识来制作一堆自定义命令。它虽

  • 本文向大家介绍php 5.6版本中编写一个PHP扩展的简单示例,包括了php 5.6版本中编写一个PHP扩展的简单示例的使用技巧和注意事项,需要的朋友参考一下 有时候在php本身没有满足需求的api时候,需要自己写相应的扩展,扩展写完之后进行编译,即可加入自己的开发环境中,扩展php的功能。 这里实现一个连接字符串和int型数的连接操作的简单扩展。 首先,下载最新的php源码安装包,进入ext/目

  • 问题内容: 我目前使用Cython链接C和Python,并以慢速的python代码获得加速。但是,我想使用goroutines实现非常慢(且可并行化)的代码,但是必须可以从python调用它。 如果有必要,我很乐意通过C(或Cython)来建立数据结构等,但是从错误修复/避免的角度来看,避免这种额外的层将是一件好事。 无需重新发明轮子的最简单方法是什么? 问题答案: 更新2015 :从Go 1.5

  • 问题内容: 是否有一些有关如何在Go中编写Ruby扩展的教程或实践课程? 问题答案: Go 1.5添加了对构建共享库的支持,这些共享库可从C(因此可以通过FFI从Ruby)调用。这使该过程比1.5版之前的版本(需要编写C胶合层)更容易,并且现在可以使用Go运行时,这在现实生活中实际上是有用的(以前无法进行goroutine和内存分配,因为它们需要Go运行时,如果Go不是主要入口点,则该运行时将无法