SpringBoot、Nginx 和 Spring security 的重定向问题

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

我在重定向方面遇到了 Spring boot 和 nginx 的问题,我有以下路径“www.dental-admin.test/back-dental-admin/microlens-service/swagger-ui.html”的一部分“ /back-dental-admin/" 使 nginx 将流量重定向到 localhost:8080 我有 spring cloud gateway 然后 "/microlens-service/" 的部分负责将网关重定向到相应的微服务,事情是当我尝试使用“www.dental-admin.test/back-dental-admin/microlens-service/swagger-ui.html”时,我被重定向到“www.dental-admin.test/back-dental-admin/microlens -service/login”,这是正常的,因为我有 spring security,但问题是当我点击登录按钮时,我被重定向到“www.dental-admin.test/microlens-service/login”,即“/back-dental-管理员/”消失。我曾尝试在 nginx 中使用“forward-headers-strategy: framework”和一些配置,但我唯一得到的是当我使用“www.dental-admin.test/back-dental-admin/microlens-service /swagger-ui.html”我被重定向到“www.dental-admin.test/back-dental-admin/back-dental-admin/microlens-service/login”,也就是说它复制了“/back-dental -admin/” 奇怪的是,它甚至没有点击登录,而是直接处于主要重定向状态。我将留下 nginx、spring gateway 和微服务的配置文件,以帮助我识别可能发生在我身上的事情。

这是 nginx 会议:


server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name www.dental-admin.test;
    ssl_certificate /etc/nginx/ssl/dental-admin.test+1.pem;
    ssl_certificate_key /etc/nginx/ssl/dental-admin.test+1-key.pem;

    location / {

        proxy_set_header Forwarded $http_forwarded;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Port $server_port;

        proxy_pass http://localhost:3000/;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    location /back-dental-admin/ {

        proxy_set_header Forwarded $http_forwarded;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_set_header X-Forwarded-Prefix /back-dental-admin/;

        proxy_pass http://localhost:8080/;
    }
}

春季网关会议


server:
  port: 8080
spring:
  application:
    zipkin: http://localhost:9411
  cloud:
    gateway:
      globalcors:
        corsConfigurations:
          '[/**]':
            allowedOrigins: "https://www.dental-admin.test/"
            allowedHeaders: "*"
            allowedMethods: "*"
            allowCredentials: true
      discovery:
        locator:
          enabled: true
      routes:
        - id: auth-service-route
          uri: lb://auth-service
          predicates:
            - Path=/auth-service/**
          filters:
            - AuthFilter
            - RewritePath=/auth-service/(?<segment>.*), /$\{segment}
        - id: client-service-route
          uri: lb://client-service
          predicates:
            - Path=/client-service/**
          filters:
            - AuthFilter
            - RewritePath=/client-service/(?<segment>.*), /$\{segment}
        - id: user-service-route
          uri: lb://user-service
          predicates:
            - Path=/user-service/**
          filters:
            - AuthFilter
            - RewritePath=/user-service/(?<segment>.*), /$\{segment}    
        - id: microlens-service-route
          uri: lb://microlens-service
          predicates:
            - Path=/microlens-service/**
          filters:
            - RewritePath=/microlens-service/(?<segment>.*), /$\{segment}

和微服务会议


server:
  port: ${PORT:${SERVER_PORT:0}}
  forward-headers-strategy: framework
spring:
  application:
    zipkin: http://localhost:9411
eureka:
  client:
    fetch-registry: true
    register-with-eureka: true
    service-url:
      default-zone: http://localhost:8761/eureka
  instance:
    instanceId: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}




spring spring-boot nginx spring-security
1个回答
0
投票

根据配置文件,我认为您的 nginx 配置和 Spring Cloud Gateway 配置都已正确设置转发标头。您的微服务配置可能存在问题。

在微服务配置文件中,您已将

forward-headers-strategy
设置为框架。这意味着 Spring 使用其默认的标头转发策略。 但是,这可能不足以满足您的特定场景。您可能需要配置要转发的其他标头,例如您在 nginx 配置中设置的
X-Forwarded-Prefix
标头。

也许您可以在微服务配置文件中定义自定义

ForwardedHeaderTransformer
bean。例如,以下 Link 是设置转发
X-Forwarded-Prefix
标头的转换器的良好参考。

我用这样的代码解决了这个问题:

@Bean
public ForwardedHeaderTransformer forwardedHeaderTransformer() {
    return new ForwardedHeaderTransformer() {
        @Override
        public HttpHeaders apply(HttpHeaders headers) {
            HttpHeaders transformed = new HttpHeaders();
            headers.forEach((key, values) -> {
                if (key.equalsIgnoreCase("X-Forwarded-Prefix")) {
                    transformed.addAll(key, values);
                }
                // add any other headers you need to forward here
            });
            return transformed;
        }
    };
}
© www.soinside.com 2019 - 2024. All rights reserved.