如何将 keycloak-admin-client 与自定义 Keycloak 提供程序一起使用

问题描述 投票:0回答:3

我正在使用 Keycloak Admin REST 客户端的自定义提供程序构建基于 Keycloak 18 的 docker 映像。我认为我还需要捆绑一些依赖项,因此我使用

maven-dependency-plugin
创建了 jar 文件并包含了这些文件。

这是我的 Dockerfile:

FROM maven:3.6.0-jdk-11-slim AS javabuild
ENV HOME=/home/app
RUN mkdir -p $HOME
WORKDIR $HOME

ADD pom.xml $HOME
ADD my-provider/pom.xml $HOME/my-provider/pom.xml

RUN mvn -pl my-provider verify --fail-never
ADD my-provider $HOME/my-provider
RUN rm -rf ${HOME}/my-provider/target
RUN mvn -pl my-provider install
RUN mvn -pl my-provider package


FROM quay.io/keycloak/keycloak:18.0.0 as builder
COPY --from=javabuild /home/app/my-provider/target/my-provider*.jar /opt/keycloak/providers/
COPY --from=javabuild /home/app/my-provider/target/dependency/*.jar /opt/keycloak/providers/

RUN /opt/keycloak/bin/kc.sh build


FROM quay.io/keycloak/keycloak:18.0.0
COPY --from=builder /opt/keycloak/ /opt/keycloak/
WORKDIR /opt/keycloak

ENTRYPOINT ["/opt/keycloak/bin/kc.sh", "start-dev", "--db=postgres"]

我很难理解我到底应该提供什么以及如何提供。

我尝试直接使用

keycloak-admin-client
并且仅将其添加为依赖项,并且没有临时依赖项,因为看起来 Keycloak 已经具有这些依赖项,因为从 Keycloak 17 开始他们使用 Quarkus。我对 Quarkus 不太了解,但查看我发现的 docker 容器文件:

bash-4.4$ ls | grep "rest"
com.openshift.openshift-restclient-java-8.0.0.Final.jar
io.quarkus.quarkus-resteasy-2.7.5.Final.jar
io.quarkus.quarkus-resteasy-common-2.7.5.Final.jar
io.quarkus.quarkus-resteasy-jackson-2.7.5.Final.jar
io.quarkus.quarkus-resteasy-server-common-2.7.5.Final.jar
org.jboss.resteasy.resteasy-core-4.7.5.Final.jar
org.jboss.resteasy.resteasy-core-spi-4.7.5.Final.jar
org.jboss.resteasy.resteasy-jackson2-provider-4.7.5.Final.jar
org.jboss.resteasy.resteasy-jaxb-provider-4.7.5.Final.jar
org.jboss.resteasy.resteasy-multipart-provider-4.7.5.Final.jar

如果我在我的提供程序中运行我的提供程序:

public class MyProvider implements RealmResourceProvider {
    private final Keycloak keycloak;

    public MyProvider(KeycloakSession session) {
        RealmModel realm = session.getContext().getRealm();

        this.keycloak = KeycloakBuilder.builder()
                .serverUrl("http://localhost:8080")
                .realm(realm.getId())
                .grantType(OAuth2Constants.CLIENT_CREDENTIALS)
                .clientId("admin-cli")
                .clientSecret("...")
                .build();

        UserResource user = this.keycloak.realm(realm.getId()).users().get("admin");
        System.out.println(user);
    }
}

我会得到

Uncaught server error: java.lang.ExceptionInInitializerError

然后我意识到也许我也应该添加

org.jboss.resteasy.resteasy-client:4.7.5-Final
。然后我就得到了

Uncaught server error: java.lang.NoClassDefFoundError: org/jboss/resteasy/client/jaxrs/ResteasyClientBuilder

然后我也尝试添加resteasy-client依赖项,所以在添加

org.jboss.resteasy.resteasy-client-api:4.7.5-Final
之后我得到了

Uncaught server error: java.util.ServiceConfigurationError: org.jboss.resteasy.client.jaxrs.spi.ClientConfigProvider: org.wildfly.security.auth.client.spi.RESTEasyClientConfigProviderImpl Unable to get public no-arg constructor
...
Caused by: java.lang.NoClassDefFoundError: org/wildfly/client/config/ConfigXMLParseException
...
Caused by: java.lang.ClassNotFoundException: org.wildfly.client.config.ConfigXMLParseException

然后我意识到

keycloack-admin-client
实际上依赖于
resteasy-client
版本
3.13.2.Final
而不是
4.7.5-Final
。所以我添加了这些版本的
resteasy-client
resteasy-multipart-provider
resteasy-jackson2-provider
resteasy-jaxb-provider
并得到了

Uncaught server error: java.lang.InstantiationError: org.jboss.resteasy.spi.ResteasyProviderFactory

现在我不知道下一步该尝试什么。

我发现这个问题报告讨论了Keycloak Admin REST客户端和Quarkus之间的Resteasy版本冲突,它提到还有另一个名为

quarkus-keycloack-admin-client
的包。所以我将其添加为依赖项,然后我再次得到:

Uncaught server error: java.lang.NoClassDefFoundError: org/keycloak/admin/client/KeycloakBuilder

还有

quarkus-keycloack-admin-client
依赖于 Keycloak 17,所以我不确定它是否与 18 100% 兼容。

所以我的问题是我应该如何将

keycloack-admin-client
包含在我的提供商中?

keycloak quarkus
3个回答
0
投票

我的问题非常相似,我将尝试构建一个定制的quarkus-keycloak-server(https://blog.codecentric.de/2022/05/keycloak-x-aber-sicher-ohne-bekannte-sicherheitsluecken/ )用我自己的扩展所需的依赖项进行扩展。我不知道这是否会导致系统运行,但我希望如此。


0
投票

我遇到了和你一样的问题,我在这里创建了一个 Keycloak 票证:https://github.com/keycloak/keycloak/issues/11973

我自己通过添加以下内容解决了这个问题:

  1. 我用 4.7.5.Final 版本覆盖了

    resteasy-client

    <!--Keycloak-->
    <dependency>
        <groupId>org.keycloak</groupId>
        <artifactId>keycloak-admin-client</artifactId>
        <scope>provided</scope>
        <exclusions>
            <exclusion>
                <groupId>org.jboss.resteasy</groupId>
                <artifactId>resteasy-client</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.jboss.resteasy</groupId>
                <artifactId>resteasy-multipart-provider</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.jboss.resteasy</groupId>
                <artifactId>resteasy-jackson2-provider</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.jboss.resteasy</groupId>
                <artifactId>resteasy-jaxb-provider</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <!--Resteasy-->
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-client</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-multipart-provider</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jackson2-provider</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jaxb-provider</artifactId>
        <scope>provided</scope>
    </dependency>
    
  2. 将所有第三方依赖项复制到

    /providers
    文件夹

  3. 因为我遇到了如下错误:

    未捕获的服务器错误:java.util.ServiceConfigurationError:org.jboss.resteasy.client.jaxrs.spi.ClientConfigProvider:org.wildfly.security.auth.client.spi.RESTEasyClientConfigProviderImpl无法获取公共无参数构造函数

    引起:java.lang.ClassNotFoundException:org.wildfly.client.config.ConfigXMLParseException

  4. 我找到了该类的依赖项并添加了它,它对我有用:)

    <dependency>
        <groupId>org.wildfly.client</groupId>
        <artifactId>wildfly-client-config</artifactId>
        <version>1.0.1.Final</version>
    </dependency>
    

0
投票

我在 Keycloak 20.0.2 中遇到了同样的问题。

我尝试了很多不起作用的解决方案,最后我通过使用 Maven 配置我的包来完成。 我用

maven-shade-plugin
逐步将我的依赖项包含在 jar 文件中,直到不再出现错误。

请参阅下面我的 pom.xml 文件。

我的版本:

<properties>
    <keycloak.version>20.0.2</keycloak.version>
    <resteasy.version>4.7.5.Final</resteasy.version>
  </properties>

我的依赖:

<dependencies>
    <dependency>
      <groupId>org.keycloak</groupId>
      <artifactId>keycloak-admin-client</artifactId>
     <version>${keycloak.version}</version>
    </dependency>
    <!--Resteasy-->
    <dependency>
      <groupId>org.jboss.resteasy</groupId>
      <artifactId>resteasy-client</artifactId>
      <version>${resteasy.version}</version>
    </dependency>
    <dependency>
      <groupId>org.jboss.resteasy</groupId>
      <artifactId>resteasy-multipart-provider</artifactId>
      <version>${resteasy.version}</version>
    </dependency>
    <dependency>
      <groupId>org.jboss.resteasy</groupId>
      <artifactId>resteasy-jackson2-provider</artifactId>
      <version>${resteasy.version}</version>
    </dependency>
    <dependency>
      <groupId>org.jboss.resteasy</groupId>
      <artifactId>resteasy-jaxb-provider</artifactId>
      <version>${resteasy.version}</version>
    </dependency>

    <dependency>
      <groupId>org.wildfly.client</groupId>
      <artifactId>wildfly-client-config</artifactId>
      <version>1.0.1.Final</version>
    </dependency>
</dependencies>

我的构建:

<build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.4.0</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <artifactSet>
                <includes>
                  <include>org.keycloak:keycloak-admin-client:*</include>
                  <include>org.jboss.resteasy:resteasy-client:*</include>
                  <include>org.jboss.resteasy:resteasy-client-api:*</include>
                  <include>org.wildfly.client:*</include>
                </includes>
              </artifactSet>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
</buils>
© www.soinside.com 2019 - 2024. All rights reserved.