Cau*_*ard 2 java api spi keycloak
我正在尝试在我的 Keycloak 服务器上创建一个自定义资源来扩展它的其余 API。所以我正在实施一个SPI。从你好世界开始。
目前我的目标是通过http://localhost:8080/auth/admin/realms/myRealm/hello上的 GET 获取“hello”+ 名称
我使用 Postman 请求服务器。我能够在 myRealm 上获得用户令牌。我选择了一个我View-users在realm-managmentMapper 中为其分配了角色的用户。
所以内置的 Keycloak Admin 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-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() {
}
}
Run Code Online (Sandbox Code Playgroud)
工厂实施:
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() {
}
}
Run Code Online (Sandbox Code Playgroud)
我还创建了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' 是您在服务上设置的路径。