实施 SPI 以扩展 Keycloak API - 找不到资源

Implementing a SPI to extend Keycloak API - Could not find resource

我正在尝试在我的 Keycloak 服务器上创建自定义资源以扩展其其余部分 API。所以我正在实施 SPI。从你好世界开始。

目前我的目标是通过 http://localhost:8080/auth/admin/realms/myRealm/hello

上的 GET 获取 "hello" + 名称

我使用 Postman 来请求服务器。我能够在 myRealm 上获得用户令牌。我选择了一个用户,我在 realm-managment 映射器中为其分配了角色 View-users

因此内置的 Keycloak Admin API 有效。 例如:http://localhost:8080/auth/admin/realms/myRealm/users/count returns 预期的用户数。

但问题是我得到了一个 "error": "RESTEASY003210: Could not find resource for full path: http://localhost:8080/auth/admin/realms/myRealm/hello/" 请求此端点时。

这是我的设置(我阅读了几个指南):

模块项目的 pom.xml 包括 keycloak-core keycloak-server-spi keycloak-server-spi-private org.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.keycloak.services.resource.RealmResourceProviderFactory 它包含对我的 HelloWorldProviderFactory

的引用

打包 jar 后,我将它的副本放入 keycloak-9.0.3\standalone\deployments 并在 运行 standalone.bat 之后创建文件 keycloak-spi-rest-hello-1.0.jar.deployed

试试这个:

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

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

@alexb83's 对我不起作用,我不得不从 url:

中省略 /admin 部分
http://localhost:8080/auth/realms/myRealm/hello/hello

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

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

另外文件org.keycloak.services.resource.RealmResourceProviderFactory 在错误的文件夹中:我错过了 \services.

工作路径是:

src\main\resources\META-INF\services\org.keycloak.services.resource.RealmResourceProviderFactory

在我的例子中,我在访问端点时混淆了 url 中子路径的顺序,即而不是

/user/customuser

我给了

/customuser/user