java 实现SPI以扩展Keycloak API -无法找到资源

j2qf4p5b  于 2023-02-18  发布在  Java
关注(0)|答案(5)|浏览(181)

我尝试在我的Keycloak服务器上创建一个自定义资源来扩展它的rest API。所以我实现了一个SPI。从一个hello world开始。
目前,我的目标是通过http://localhost:8080/auth/admin/realms/myRealm/hello上的GET获得“hello”+名称
我使用Postman来请求服务器。我能够在myRealm上获得一个用户令牌。我选择了一个用户,在realm-managmentMap器中为该用户分配了角色View-users
因此,内置的Keycloak管理API工作。例如:http://localhost:8080/auth/admin/realms/myRealm/users/count返回预期的用户计数。
但问题是我得到了一个“错误”:“复位003210:找不到完整路径的资源:“http://localhost:8080/auth/admin/realms/myRealm/hello/“的值。
下面是我的设置(我读了几个指南):
模块项目的pom.xml包含keycloak-corekeycloak-server-spikeycloak-server-spi-privateorg.jboss.spec.javax.ws.rs的依赖项
领域资源提供程序实现:

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.keycloak.services.resource.RealmResourceProviderFactory,其中包含对我的HelloWorldProviderFactory的引用
封装jar后,我将其副本放入keycloak-9.0.3\standalone\deployments中,运行standalone.bat后,将创建文件keycloak-spi-rest-hello-1.0.jar.deployed

kiayqfof

kiayqfof1#

所以正如alexb 83所说,我错过了url中的第二个/hello。
正如PotatoesMaster所说,我不得不在URL中省略/admin。
此外,文件org.keycloak.services.resource.RealmResourceProviderFactory位于错误的文件夹中:我错过了**\服务**。
工作路径为:
src\main\resources\META-INF\services\org.keycloak.services.resource.RealmResourceProviderFactory

fdx2calv

fdx2calv2#

@alexb83的answer对我不起作用,我不得不省略url中的/admin部分:

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

gfttwv5a3#

在我的例子中,当访问端点时,我混淆了url中子路径的顺序,也就是说
/用户/自定义用户
我已经给了
/自定义用户/用户

gopyfrb3

gopyfrb34#

在我的例子中,我不得不省略/auth/admin,所以我的最终工作地址是:网址:

vxbzzdmp

vxbzzdmp5#

试试这个:
网址:http://localhost:8080/auth/admin/realms/myrealm/hello
因为第一个"hello"是工厂ID的名称,而第二个"hello"是您在服务上设置的路径。

相关问题