繁体   English   中英

Spring4 + OAuth2 + CXF/JAXRS + Keycloak

[英]Spring4 + OAuth2 + CXF/JAXRS + Keycloak

尝试在我的 java spring 微服务中实现 oauth2 用法时遇到了问题。 我发现的几乎每篇文章(关于示例)都是关于 Spring Boot 和 oauth2 的。 但是我有一个带有 springSecurity.xml 的简单 Java CXF/JAXRS 微服务为了更好地理解我想要实现的目标:我有一个 Java 微服务可以与其他微服务通信。 它没有任何前端,它只是一个后端服务。 它包括用于文档目的的 openAPI/swagger,并使用 swagger-ui(通过 maven 插件包含)来测试端点。 我知道配置 swagger-ui 是我以后必须采取的另一个步骤。 首先,我想用 oauth2 保护我的微服务。

我发现的至少看起来有点像我正在寻找的东西是这样的: https : //github.com/tfeng/play-oauth2/blob/master/conf/spring/security-context.xml我以前的安全-context.xml 看起来像这样:

    <sec:http pattern="/rest/**">
        <sec:csrf disabled="true" />
        <sec:intercept-url access="isAuthenticated()"
                           pattern="/**" />
        <sec:http-basic />
    </sec:http>

    <sec:http>
        <sec:csrf disabled="true" />
        <sec:intercept-url access="isAuthenticated()"
                           pattern="/**" />
        <sec:http-basic />
        <sec:logout />
    </sec:http>

    <sec:authentication-manager>
        <sec:authentication-provider>
            <sec:user-service>
                <sec:user authorities="" name="myApiUser" password="my4p1Secr3t" />
            </sec:user-service>
        </sec:authentication-provider>
    </sec:authentication-manager>

在最好的情况下,我可以配置我的微服务和 swagger-ui 以使用 Keycloak 进行身份验证/授权。

如果有人能帮助我并指出我正确的方向,我会很高兴。 也许有一些步骤或解释以获得更多的澄清。

由于您使用的是 spring xml 配置,据我所知,您想手动定义 springboot 的自动配置和扫描所做的配置。 首先,假设您在 pom.xml 中定义了依赖项,您需要对 keycloak 包org.keycloak.adapters.springsecurity进行组件扫描

<dependency>
    <groupId>org.keycloak</groupId>
    <artifactId>keycloak-spring-security-adapter</artifactId>
    <version>14.0.0</version>
</dependency>

要使用 Spring Security 保护应用程序,您必须在 Spring Security 配置文件中提供一些额外的 bean,并将 Keycloak 安全过滤器添加到您的管道中:

  • 为了使单点注销正常工作,您必须定义一个会话侦听器,以太作为包装在ServletListenerRegistrationBean<HttpSessionEventPublisher>对象中的 spring bean 或纯 spring 安全环境的 web.xml 文件中。
<listener>
     <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
</listener>
  • 既然你已经有了你的监听器并且扫描了 keycloak bean,你可以开始定义你的身份验证管理器和提供者。
<security:authentication-manager alias="authenticationManager">
        <security:authentication-provider ref="keycloakAuthenticationProvider" />
    </security:authentication-manager>

    <bean id="keycloakAuthenticationProvider" class="org.keycloak.adapters.springsecurity.authentication.KeycloakAuthenticationProvider" />
  • 客户端应用程序的 json 配置是通过adapterDeploymentContext bean 加载的,它指定客户端应如何与 auth-server 通信。
<bean id="adapterDeploymentContext" class="org.keycloak.adapters.springsecurity.AdapterDeploymentContextFactoryBean">
        <constructor-arg value="/WEB-INF/keycloak.json" />
    </bean>

这是该 json 文件的示例,用于名为 plantarium 的项目,

{
  "realm" : "plantarium",
  "resource" : "plantarium-plants",
  "use-resource-role-mappings" : true,
  "auth-server-url" : "${env.AUTH_SERVER_URL:http://0.0.0.0:8080/auth}",
  "ssl-required" : "external",
  "enable-cors" : true,
  "cors-max-age" : 1000,
  "cors-allowed-methods" : "POST, PUT, DELETE, GET",
  "cors-exposed-headers" : "WWW-Authenticate, My-custom-exposed-Header",
  "bearer-only" : false,
  "expose-token" : true,
  "principal-attribute": "preferred_username",
  "verify-token-audience" : false,
  "connection-pool-size" : 20,
  "disable-trust-manager": true,
  "allow-any-hostname" : false,
  "token-minimum-time-to-live" : 10,
  "min-time-between-jwks-requests" : 10,
  "public-key-cache-ttl": 86400,
  "confidential-port": 0
}

这就是我现在可以给你替换 springboot 注释配置的东西,这个和下面的内容应该可以帮助你将 keycloack 与普通的基于 spring xml 的客户端一起使用,

其余的 xml 可以在这里找到: https : //www.keycloak.org/docs/latest/securing_apps/#_spring_secUrity_adapter 这基本上是定义过滤器和端点,我相信它会特定于您的需求。 在此之后,您应该能够在没有任何自动配置注释或 springboot 启动器的情况下运行您的客户端。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM