Keycloak使用自定义协议映射器从数据库/外部源添加额外声明

Ala*_*icB 9 java customization keycloak

我已经看到这两个帖子给出了这个问题的解决方案,但是他们没有提供关于如何为像我这样的非Java开发人员这样做的详细信息:

Keycloak从数据库/外部源添加额外声明

如何在Keycloak中注册自定义ProtocolMapper?

以下是他们的解决方案的概述,如果有更多细节,可以帮助其他人.

从第一个链接预期的过程

  1. 用户登录
  2. 调用我的自定义协议映射器,其中我覆盖transformAccessToken方法
  3. 在这里,我将协议映射器所在的客户端登录到keycloak中作为服务.这里不要忘记使用另一个客户端ID而不是您正在构建协议映射器的客户端ID,否则您将输入无限递归.
  4. 我将访问令牌放入协议映射器中,然后调用应用程序的其余端点来获取额外的声明,这是有保证的.
  5. 获取端点返回的信息并将其添加为额外声明

从第二个链接实现它的步骤

实现ProtocolMapper接口并添加包含对类的引用的文件 "META-INF/services/org.keycloak.protocol.ProtocolMapper".

此时Keycloak认识到新的实现.您应该能够通过管理控制台进行配置.

要向令牌添加一些数据,请添加以下接口

org.keycloak.protocol.oidc.mappers.OIDCAccessTokenMapper

并根据接口实现方法

然后使用以下内容添加文件" META-INF/jboss-deployment-structure.xml "

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
    <deployment>
        <dependencies>
            <module name="org.keycloak.keycloak-services"/>
        </dependencies>
    </deployment>
</jboss-deployment-structure>
Run Code Online (Sandbox Code Playgroud)

完成所有这些后,每次对URL http://:/ auth/realms/testrealm/protocol/openid-connect/token的请求都会调用自定义transformAccessToken()方法

看完之后我有几个问题:

  1. 你如何"实现ProtocolMapper"
  2. 你在哪里添加前面提到的文件?(在我的Keycloak安装文件夹中看不到任何META-INF /目录)
  3. 您如何以及在何处"添加以下界面"
  4. 自定义transformAccessToken()是什么样的

谢谢大家的时间.如果我错过总结他们的答案,请告诉我.

编辑:

我开始获得赏金,希望有人能够在Keycloak 3.4.3中为我提供有关如何在数据库中添加额外声明的详细步骤(对于非Java开发人员来说足够详细)

编辑2 这里描述的方法可以做到这一点,但缺乏细节. Keycloak创建自定义身份提供者映射器

Evi*_*unk 13

我希望这个一步一步的指南可以帮助你

我正在使用Keycloak 4.5.0 - 因为我安装了这个新版本 - 但我不应该有很大的不同.我OIDCProtocolMapper在示例中实现了一个.

总结一下 - 对于其他人的快速概述 - 后面将详细介绍每个步骤

  1. 您基于实现CustomProtocolMapper类 AbstractOIDCProtocolMapper

  2. META-INF/services文件名org.keycloak.protocol.ProtocolMapper必须可用,并包含映射器的名称

  3. jboss-deployment-structure.xml 需要可以使用内置类的keycloak

  4. Jar文件部署在 /opt/jboss/keycloak/standalone/deployments/

好的,现在更多细节:-)

创建自定义Mapper

我上传了你的maven pom.xml(pom) - 只需将它导入你的IDE,所有的依赖项都应该自动加载.依赖关系只是provided 稍后将在运行时直接从keycloak使用

相关keycloak.version属性 - 所有keycloak依赖项当前都在版本中加载4.5.0.Final

现在我创建了一个名为的自定义协议映射器类CustomOIDCProtocolMapper.在这里找到"完整"代码

它应该扩展AbstractOIDCProtocolMapper并需要实现所有抽象方法.也许你想拥有一个SAML协议映射器然后它是另一个基类(AbstractSAMLProtocolMapper)

一个相关的方法是transformAccessToken- 在这里我为AccessToken设置了一个额外的声明.你需要你的逻辑,但是 - 取决于你的数据库等;-)

服务文件

服务文件对于keycloak查找自定义实现非常重要

将一个文件的文件名 org.keycloak.protocol.ProtocolMapper\src\main\resources\META-INF\services\

在这个文件里面你写了自定义Provider的Name - 所以keycloak知道这个类可用作协议映射器
在我的例子中文件内容只是一行

com.stackoverflow.keycloak.custom.CustomOIDCProtocolMapper
Run Code Online (Sandbox Code Playgroud)

部署结构XML

在自定义映射器中,您可以使用keycloak中的文件.为了使用它们,我们需要告知jboss这种依赖性.因此jboss-deployment-structure.xml\src\main\resources\META-INF\ Content中创建一个文件:

<jboss-deployment-structure>
    <deployment>
        <dependencies>
            <module name="org.keycloak.keycloak-services" />
        </dependencies>
    </deployment>
</jboss-deployment-structure>
Run Code Online (Sandbox Code Playgroud)

构建和部署您的扩展

建立你的扩展(一个JAR文件mvn clean package) -并把jar/opt/jboss/keycloak/standalone/deployments/,并重新启动keycloak

在日志文件中,您应该看到它何时部署并且(希望没有)错误消息

现在你可以使用你的映射器 - 在我的例子中,我可以在keycloak admin ui中创建一个Mapper并Stackoverflow Custom Protocol Mapper从下拉列表中选择

就像信息一样 - 这不是keycloak完全正式支持的 - 所以接口可能会在以后的版本中发生变化

我希望这是可以理解的,你将能够成功实现自己的映射器

编辑:导出的eclipse文件结构zip