如何将Keycloak与Payara Micro集成?

时间:2018-05-13 18:54:33

标签: rest jax-rs keycloak payara-micro microprofile

如何将KeycloakPayara Micro进行整合?

我想创建一个使用Keycloak作为身份验证和授权服务器的无状态REST JAX-RS应用程序,但我不知道它是如何做的。

Eclipse MicroProfile JWT Authentication API定义@LoginConfig注释:

@LoginConfig(authMethod = "MP-JWT", realmName = "admin-realm")
@ApplicationPath("/")
public class MyApplication extends Application {...}

java EE @RolesAllowed注释:

@Path("/api/v1/books")
public class BooksController {

    @GET
    @RolesAllowed("read-books")
    public Books findAll() {...}

}

如何整合这两件事?

3 个答案:

答案 0 :(得分:3)

我在个人项目中遇到了同样的挑战,并且提到Keycloak项目没有为Payara提供原生适配器,在那一刻我做了一个库来保护我的应用程序与Keycloak,如果你愿意,你可以把它拿一个看看并告诉我它是否正常或我们如何改进它。

https://github.com/pablobastidasv/kc_security

答案 1 :(得分:1)

Keycloak项目没有为Payara Server或Payara Micro提供原生适配器,Payara项目也没有提供。

但是Keycloak还提供了一个通用的servlet过滤器适配器,它也应该与Payara Micro一起使用:https://www.keycloak.org/docs/latest/securing_apps/index.html#_servlet_filter_adapter

只需将keycloak-servlet-filter-adapter依赖项添加到您的Web应用程序中,然后根据文档在web.xml中配置适配器。我没有测试过,所以我不知道它是否真的有效。

答案 2 :(得分:1)

您可以在The Payara Monthly Roundup for April 2019

中找到解决方案

MicroProfile JWT with Keycloak-在此分步博客中,Hayri Cicek演示了如何使用MicroProfile JWT和Keycloak保护您的服务。

初始化LoginConfig并使用DeclareRoles映射角色

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import org.eclipse.microprofile.auth.LoginConfig;
import javax.annotation.security.DeclareRoles;

@LoginConfig(authMethod = "MP-JWT")
@ApplicationPath("/")
@DeclareRoles({ "mysimplerole", "USER" })
public class ApplicationConfig extends Application {

}

将参数添加到microprofile-config.properties

mp.jwt.verify.publickey.location=http://localhost:8084/auth/realms/public/protocol/openid-connect/certs
mp.jwt.verify.issuer=http://localhost:8084/auth/realms/public

您可以在RolesAllowed中使用您的角色

@ApplicationScoped
@Path("/hello")
public class HelloWorldEndpoint {

    @GET
    @Produces("text/plain")
    @RolesAllowed("mysimplerole")
    public Response doGet() {
        return Response.ok("Hello from MicroProfile!").build();
    }
}