Spring Boot 将其主机名替换为 docker 容器 ID

问题描述 投票:0回答:1

我使用 Keycloak 设置了一个简单的 Spring Boot 应用程序,该应用程序作为带有 eureka、网关 api 等的服务运行。所有这些都是 Docker 化的。 我创建了一个返回字符串并由 SecurityFilterChain 保护的端点:

    @Bean
    public SecurityFilterChain configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
                .oauth2Client(Customizer.withDefaults())
                .oauth2Login(Customizer.withDefaults());
        httpSecurity
                .sessionManagement(Customizer.withDefaults());
        httpSecurity
                .authorizeHttpRequests(Customizer.withDefaults())
                .authorizeHttpRequests(authorize -> {
                    authorize
                            .requestMatchers("/keycloak-test", "/tournament/keycloak-test").fullyAuthenticated()
                            .anyRequest().permitAll();
                });
        return httpSecurity.build();
    }

终点:

    @GetMapping("/keycloak-test")
    public ResponseEntity<String> test() {
        return ResponseEntity.ok("Hello World");
    }

当我尝试访问此端点时,我期望重定向到登录表单或 keycloak 本身,但问题是我被重定向到 containerId:port:

http://6e375582a097:8201/oauth2/authorization/keycloak-provider
因此出现“找不到服务器”错误。

我的应用程序.yml:

eureka:
  client:
    service-url:
      defaultZone: http://172.18.0.1:8762/eureka
server:
  port: 8201
  error:
    include-message: always
spring:
  datasource:
    url: jdbc:postgresql://172.18.0.1:5501/tournament
    username: username
    password: ${DB_STG_PASSWORD}
    driver-class-name: org.postgresql.Driver
    hikari:
      connection-timeout: 10000
      maximum-pool-size: 10
      idle-timeout: 5000
      max-lifetime: 1000
      auto-commit: true
  flyway:
    locations: classpath:db/migration
    enabled: true
  jpa:
    show-sql: true
    properties:
      hibernate:
        dialect: org.hibernate.dialect.PostgreSQLDialect
  security:
    oauth2:
      client:
        provider:
          keycloak-provider:
            issuer-uri: https://keycloak.example.com/realms/keycloak-realm
        registration:
          aimcup:
            provider: keycloak-provider
            client-name: keycloak-provider
            client-id: keycloak-provider
            client-secret: 
            scope: profile,openid,offline_access
            redirect-uri: https://example.com/keycloak-test

我想提一下,我也在使用 nginx 代理管理器。

我尝试查看所有过滤器并检查重定向 uri 何时确定,但没有一个过滤器能让我眼前一亮。 将

server.address
中的
application.yml
属性设置为我的
example.com
也不起作用。

是因为eureka有一个容器id而不是IP地址吗?

预先感谢您的帮助!

spring spring-boot spring-security keycloak netflix-eureka
1个回答
0
投票

对于 Spring Boot 3,将

forward-headers-strategy
设置为
native
,它就会按预期工作:

server.forward-headers-strategy: native

© www.soinside.com 2019 - 2024. All rights reserved.