首页 > 解决方案 > Spring重定向发生在“http://...../login”而不是“https://...../login”

问题描述

我已经使用 oauth2 部署了一个由 spring boot 应用程序生成的 war 文件,用于使用 Azure App 服务(仅限 https)进行单点登录。

当我浏览到主页时,主页会加载一个登录按钮。单击登录按钮时,将重定向到“http://..../login”(/login 是默认的 sso 登录路径)由于我的应用程序服务仅是 https,因此 http url 不起作用。

我已经尝试了 application.property 文件中的 redirect_uri 设置,但它没有帮助。有人遇到过这个问题吗?怎么解决?

我发现了这里提到的类似问题

标签: springazurespring-securityazure-web-app-service

解决方案


当您的 Tomcat 服务器位于代理之后时,就会出现此问题。HTTPS 请求在代理处终止,然后代理使用 HTTP 协议与您的 Tomcat 服务器通信。如果您将代码部署在 Azure(应用服务)等云提供商上,您将面临这种情况。

对于遇到此问题的任何人,以下是解决方案:

在 application.properties 文件中,添加以下内容。注意:某些属性在 Spring Boot 2.* 版本中具有不同的名称。

security.oauth2.client.pre-established-redirect-uri=https://yourappurl.net/login
security.oauth2.client.registered-redirect-uri=https://yourappurl.net/login
security.oauth2.client.use-current-uri=false
server.tomcat.remote-ip-header=x-forwarded-for
server.tomcat.protocol-header=x-forwarded-proto
server.tomcat.use-relative-redirects=true
server.use-forward-headers=true
server.tomcat.internal-proxies=.*

在您的 SpringBootApplication 类中,添加以下 bean。对于 Spring Boot <= 2.1.x,您必须提供 ForwardedHeaderFilter-Bean。从 Spring Boot 2.2.0 开始,您不必再这样做了。

import org.springframework.core.Ordered;
import org.springframework.web.filter.ForwardedHeaderFilter;
@Bean
FilterRegistrationBean<ForwardedHeaderFilter> forwardedHeaderFilter() {
    final FilterRegistrationBean<ForwardedHeaderFilter> filterRegistrationBean = new FilterRegistrationBean<ForwardedHeaderFilter>();
    filterRegistrationBean.setFilter(new ForwardedHeaderFilter());
    filterRegistrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
    return filterRegistrationBean;
}

在 AppConfiguration 类的 configure 方法中添加以下行:

http.requiresChannel().anyRequest().requiresSecure();

有关官方信息,请访问此页面


推荐阅读