带有 keycloak 的 Spring Cloud 微服务

Posted

技术标签:

【中文标题】带有 keycloak 的 Spring Cloud 微服务【英文标题】:Spring Cloud microservice with keycloak 【发布时间】:2020-07-01 07:44:45 【问题描述】:

我有一个 Spring Cloud 微服务项目,它使用 Spring Cloud Config Server 来管理配置和 Eureka Server 来发现服务。

在我想使用 keycloak 添加新的微服务之前,我的应用程序运行良好。这个新的微服务只是我的 Vue 前端应用程序的一个 rest API,预计用户管理将由 Keycloak 处理。

新服务运行正常并将自己注册到 Eureka 直到我将 keycloak 依赖项添加到项目中。应用程序不会崩溃或抛出任何错误,启动正常并将自身注册到 Eureka,但在 Spring Boot 管理服务器面板上我看到应用程序已关闭。

这是我的新服务的 .properties 文件。

eureka.instance.preferIpAddress=true
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka
eureka.instance.leaseRenewalIntervalInSeconds=3
eureka.client.eureka-connection-idle-timeout-seconds=3
eureka.client.fetchRegistry=true

spring.boot.admin.client.url=http://localhost:6060
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always

server.port=8082

keycloak.auth-server-url=http://localhost:8080/auth
keycloak.realm=microservices
keycloak.resource=microservices-app
keycloak.public-client=true

keycloak.security-constraints[0].authRoles[0]=user
keycloak.security-constraints[0].securityCollections[0].patterns[0]=/*
keycloak.cors=true

这是我对新服务的依赖项。

...
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.thymeleaf</groupId>
                <artifactId>thymeleaf</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.keycloak</groupId>
        <artifactId>keycloak-spring-boot-starter</artifactId>
        <version>4.8.3.Final</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.keycloak.bom</groupId>
            <artifactId>keycloak-adapter-bom</artifactId>
            <version>4.8.3.Final</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

春云版是Hoxton.SR1

Spring boot 版本为2.2.2.RELEASE

我尝试使用 KeycloakAuthenticationProvider 添加 Spring Security 并进行 java 配置,但没有帮助。

在整个项目中,我遇到了很多由 Spring Cloud 版本或 Spring Cloud-Spring Boot Admin 交互引起的奇怪错误,因此更改版本或在配置文件中添加一个小参数通常可以解决问题,我怀疑这个 Keycloak 问题将是以同样的方式解决。

【问题讨论】:

【参考方案1】:

Spring Boot Admin 使用执行器端点,尝试使它们不受保护:

    keycloak.security-constraints[0].authRoles[0]=user
    keycloak.security-constraints[0].securityCollections[0].patterns[0]=/*
    keycloak.security-constraints[0].securityCollections[1].patterns[0]=/actuator
    keycloak.security-constraints[0].securityCollections[1].patterns[1]=/actuator/*

【讨论】:

添加这些端点解决了这个问题。我最终从属性中删除了这些端点配置,允许 Spring Security 中的所有端点并使用@PreAuthorize 来限制对端点的访问。 @gadria 你好,我正在尝试实现相同的架构,但由于缺少将 Spring Cloud 与 keycloak 一起使用的资源,我现在正在苦苦挣扎。所以我的情况是我有这个简单的 ER 图,其中“用户”表与另一个名为“订单”的表具有一对多关系。 Keycloak 确实让我们可以使用 mysql 而不是 H2,但我想知道 Keycloak 是否可以使用我的图表?我可以做 CRUD 操作吗,比如如果我删除一个用户,然后删除也会级联到他的订单? 级联 crud 操作与 keycloak 有什么关系?

以上是关于带有 keycloak 的 Spring Cloud 微服务的主要内容,如果未能解决你的问题,请参考以下文章

带有 Keycloak 的 Spring 应用程序返回 401 错误

带有 Spring Boot KeycloakSecurityContext 的 Keycloak 始终为空

带有 keycloak 设置的 Spring Security (HttpSecurity)

带有 keycloak 的 Spring Cloud 微服务

带有 Keycloak 的 Spring Security OAuth2 - 访问用户信息

在 Spring Boot 和 Spring Security 中,不活动、过期的令牌会导致带有 Keycloak 的 IllegalStateException