Spring4 + OAuth2 + CXF/JAXRS + 密钥斗篷

Spring4 + OAuth2 + CXF/JAXRS + Keycloak

我在 java spring 微服务中尝试实现 oauth2 使用时遇到了困难。我发现的几乎每篇文章(关于示例)都是关于 Spring Boot 和 oauth2。但是我有一个简单的 Java CXF/JAXRS 微服务和 springSecurity.xml 为了更好地理解我想要实现的目标:我有一个 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 用于 authentication/authorization。

如果有人能帮助我并指出正确的方向,我会很高兴。可能需要一些步骤或解释才能更清楚。

由于您使用的是 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 安全性保护应用程序,您必须在 Spring 安全配置文件中提供一些额外的 bean,并将 Keycloak 安全过滤器添加到您的管道中:

  • 为了单点退出正常工作,你必须定义一个会话监听器,ether 作为一个 spring bean 包装在一个 ServletListenerRegistrationBean<HttpSessionEventPublisher> 对象中 或者在您的 web.xml 文件中用于纯 spring 安全环境。
<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
}

这是我现在可以给你的替换 spring 引导注释配置的东西,这个和下面的应该可以帮助你使用 keycloack 和普通的旧 spring xml基于客户,

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