java - Keycloak 使用自定义协议(protocol)映射器添加来自数据库/外部源的额外声明

标签 java customization keycloak

我看过这两篇文章给出了这个问题的解决方案,但他们没有提供足够详细的信息来说明如何为像我这样的非 Java 开发人员提供解决方案:

Keycloak add extra claims from database / external source

How to register a custom ProtocolMapper in Keycloak?

这里是他们解决方案的概述,如果提供更多详细信息,可能会对其他人有所帮助。

预期过程 from 1st link

  1. User logs in
  2. My custom protocol mapper gets called, where I overwrite the transformAccessToken method
  3. Here I log in the client where the protocol mapper is in into keycloak, as a service. Here don't forget to use another client ID instead the one you're building the protocol mapper for, you'll enter an endless recursion otherwise.
  4. I get the access token into the protocol mapper and I call the rest endpoint of my application to grab the extra claims, which is secured.
  5. Get the info returned by the endpoint and add it as extra claims

实现它的步骤 from 2nd link

Implement the ProtocolMapper interface and add the file "META-INF/services/org.keycloak.protocol.ProtocolMapper" containing the reference to the class.

At this point Keycloak recognizes the new implementation. And you should be able to configure it via the admin console.

To add some data to the token add the following interfaces

org.keycloak.protocol.oidc.mappers.OIDCAccessTokenMapper

and implement the methods according to the interface

Then add the file "META-INF/jboss-deployment-structure.xml" with the following content

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
    <deployment>
        <dependencies>
            <module name="org.keycloak.keycloak-services"/>
        </dependencies>
    </deployment>
</jboss-deployment-structure>

And after doing all this the custom transformAccessToken() method is called on every request to URL http://:/auth/realms/testrealm/protocol/openid-connect/token

看完这篇我有几个问题:

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

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

编辑:

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

编辑 2 此处描述的方法可以解决问题,但缺乏细节。 Keycloak create a custom identity provider mapper

最佳答案

我希望这个循序渐进的指南能帮到你

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

只是总结一下 - 为了其他人的快速概览 - 每个步骤稍后都会更详细地描述

  1. 你实现了一个基于 CustomProtocolMapper 的类 AbstractOIDCProtocolMapper

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

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

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

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

创建自定义映射器

我为您上传了我的 maven pom.xml ( pom ) - 只需将其导入您的 IDE,所有依赖项都会自动加载。依赖项只是提供,稍后将在运行时直接从keycloak使用

相关的是 keycloak.version 属性——所有 keycloak 依赖项当前都在版本 4.5.0.Final

中加载

现在我创建了一个名为 CustomOIDCProtocolMapper 的自定义协议(protocol)映射器类。查找“完整”代码 here

它应该扩展AbstractOIDCProtocolMapper 并且需要实现所有的抽象方法。也许您想拥有一个 SAML 协议(protocol)映射器,那么它是另一个基类 (AbstractSAMLProtocolMapper)

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

服务文件

服务文件对于 keycloak 找到您的自定义实现重要

\src\main\resources\META-INF\services\ 中放置一个带有 fileName org.keycloak.protocol.ProtocolMapper 的文件>

在此文件中,您写入自定义提供者的名称 - 因此 keycloak 知道此类可用作协议(protocol)映射器
在我的示例中,文件内容只有一行

com.stackoverflow.keycloak.custom.CustomOIDCProtocolMapper

部署结构 XML

在您的自定义映射器中,您使用来自 keycloak 的文件。为了使用它们,我们需要通知 jboss 这种依赖关系。 因此在 \src\main\resources\META-INF\ 中创建一个文件 jboss-deployment-structure.xml 内容:

<jboss-deployment-structure>
    <deployment>
        <dependencies>
            <module name="org.keycloak.keycloak-services" />
        </dependencies>
    </deployment>
</jboss-deployment-structure>

构建和部署您的扩展

为您的扩展构建一个 jar 文件 (mvn clean package) - 并将 jar 放在 /opt/jboss/keycloak/standalone/deployments/ 并重启 keycloak

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

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

就像信息一样——这不是 keycloak 完全官方支持的——所以接口(interface)可能会在以后的版本中改变

我希望它是可以理解的,并且您将能够成功实现自己的映射器

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

关于java - Keycloak 使用自定义协议(protocol)映射器添加来自数据库/外部源的额外声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53089776/

相关文章:

maven - 在本地Maven存储库中发布hadoop的安装

python - 导入错误: No module named menu

Emacs组织模式: Customize date picker layout

node.js - 使用 keycloak-connect + typescript - 使用需要特定参数的函数,但我不知道它指的是什么

Keycloak:在生成的 token 中包含请求范围的角色

java - 让 Spring 的 IoC 容器以零配置实例化 beans(如 Google Guice 的行为)

java - 解释 JVM 类转换异常错误消息 - 无法转换的原始类型是什么

Instant.EPOCH 的 Java 8 时区不正确

java - java 机场航类的生产者-消费者

java - 将 Keycloak 与符合 FIPS 的 JDK 一起使用