实施 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
我正在尝试在我的 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
/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