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

实现SPI以扩展KeyClope API-找不到资源

暨承平
2023-03-14

我试图在我的密钥斗篷服务器上创建一个自定义资源来扩展它的Rest应用编程接口。所以我正在实现一个SPI。从你好世界开始。

目前,我的目标是通过一次“上车”获得一个“你好”的名字http://localhost:8080/auth/admin/realms/myRealm/hello

我使用Postman请求服务器。我能够在myRealm上获得用户令牌。我选择一个用户,我已经在领域管理映射器中为其分配了角色View-user

所以内置的keydepeat管理API可以工作。例如:http://localhost:8080/auth/admin/realms/myRealm/users/count返回预期的用户计数。

但问题是我得到了一个“错误”:“RESTEASY003210:无法找到完整路径的资源:http://localhost:8080/auth/admin/realms/myRealm/hello/“请求此终结点时。

以下是我的设置(我读了几本指南):

模块项目的pom.xml包括对keycloak-core的依赖关系keycloak-server-spi keycloak-server-spi keycloak-server-spi-Privateorg.jboss.spec.javax.ws.rs

RealmResourceProvider实现:

public class HelloWorldProvider implements RealmResourceProvider {

    private KeycloakSession session;

    public HelloWorldProvider(KeycloakSession session) {
        this.session = session;
    }

    @Override
    public Object getResource() {
        return this;
    }

    @GET
    @Path("/hello")
    @Produces("text/plain; charset=utf-8")
    public String get() {
        String name = session.getContext().getRealm().getDisplayName();
        if (name == null) {
            name = session.getContext().getRealm().getName();
        }
        return "Hello" + name;
    }

    @Override
    public void close() {
    }
}

工厂实施:

public class HelloWorldProviderFactory implements RealmResourceProviderFactory {

    public static final String ID = "hello";

    @Override
    public String getId() {
        return ID;
    }

    @Override
    public int order() {
        return 0;
    }

    @Override
    public RealmResourceProvider create(KeycloakSession keycloakSession) {
        return new HelloWorldProvider(keycloakSession);
    }

    @Override
    public void init(Config.Scope scope) {
    }

    @Override
    public void postInit(KeycloakSessionFactory keycloakSessionFactory) {
    }

    @Override
    public void close() {
    }
}

我还创建了文件src\main\resources\META-INF\org。钥匙斗篷。服务。资源RealmResourceProviderFactory它包含对myHelloWorldProviderFactory

打包jar后,我把它的一个副本放在keycloak-9.0.3\独立\部署中,并在运行standalone.bat之后创建文件keycloak-spi-rest-hello-1.0.jar.deployed

共有3个答案

晏炳
2023-03-14

@alexb83的答案对我不起作用,我不得不从网址中省略/admin部分:

http://localhost:8080/auth/realms/myRealm/hello/hello
夏侯俊美
2023-03-14

正如alexb83所说,我错过了url中的第二个/hello。

正如PotatoesMaster所说,我不得不在url中省略/admin。

另外,文件org.keycloak.services.resource.RealmResourceProviderFactory位于错误的文件夹中:我错过了\service。

工作路径为:

src\main\resources\META-INF\services\org。钥匙斗篷。服务。资源RealmResourceProviderFactory

管和志
2023-03-14

试试这个:

http://localhost:8080/auth/admin/realms/myRealm/hello/hello

因为第一个“hello”是工厂ID的名称,而第二个“hello”是您在服务上设置的路径。

 类似资料:
  • 描述 SPI 的全名为 : Service Provider Interface。 SPI 具体约定 当服务的提供者,提供了服务接口的一种实现之后,在 jar 包的META-INF/services/ 目录里同时创建一个以 服务接口 命名的文件。该文件里就是实现该服务接口的具体实现类。而 Jboot 装配这个模块的时候,就能通过该 jar 包 META-INF/services/ 里的配置文件找到

  • 一、背景 早在8月份的时候,我就做了一些MR的Join查询,但是发现回北京之后,2个月不用,居然有点生疏,所以今天早上又花时间好好看了一下,顺便写下这个文档,以供以后查阅。 二、环境 JDK 1.6、Linux操作系统、hadoop0.20.2 三、资料数据 在做这个Join查询的时候,必然涉及数据,我这里设计了2张表,分别较data.txt和info.txt,字段之间以t划分。 data.txt

  • SPI 扩展接口仅用于系统集成,或 Contributor 扩展功能插件。

  • 问题内容: 谁能告诉我第一和第二代码之间的区别是什么?MaxPQ代表优先级队列,它是可以相互比较的“关键”对象的集合。 代码1: 代码2: 第二个代码没有编译,但是对我来说不直观,为什么在使用泛型时为什么需要扩展而不是实现接口。 问题答案: 区别非常简单:第二个代码段不会编译,也永远不会编译。对于泛型,您始终对类和接口都使用。也可以在此处使用关键字,但是它具有不同的语义。

  • 我希望有一个方法返回一个类 ,该类根据作业类型具有不同的方法。 例如,作业类型可以是 或 。它们不共享方法,但需要从单个方法getJob()中获取它们。 现在我有一个普通的类< code>job,它的方法返回< code>null,没有构造函数,因为我在< code>getJob()方法中构造了其他类(例如BackupJob或RunCommandJob)。 在返回单个类的同时获得不同工作类的最佳方

  • 我正试图用三个额外的日期(时间戳)字段扩展扩展扩展名(新闻),并希望在(新闻)的fluidtemplate中调用这些字段。 我已经连线到目前为止,我可以看到我的后端额外的字段,而无需选择一个外部类型-我已经相应地修改了ext_tables.php,并可以保存数据。 现在,我试图在我的新闻流模板中使用这些字段,在我的Partials/List/Item中使用以下代码。html-{newsItem.d