spring-security Spring重定向发生在“http://..../login”而不是“https://..../login”

t1qtbnec  于 2022-11-11  发布在  Spring
关注(0)|答案(2)|浏览(193)

我已经使用oauth2部署了一个由Sping Boot 应用程序生成的war文件,以便使用Azure应用程序服务(仅限https)进行单点登录。
当我浏览到主页时,主页加载了一个登录按钮。单击登录按钮时,将重定向到“http://.../login”(/login是默认的sso登录路径)。由于我的应用程序服务仅支持https,因此http url不起作用。
我试过www.example.com文件中的redirect_uri设置application.property,但没有任何帮助。有人遇到过这个问题吗?如何解决?
我发现类似的问题提到here

col17t5w

col17t5w1#

当您的Tomcat服务器位于代理服务器之后时会发生此问题。HTTPS请求在代理服务器处终止,然后代理服务器使用HTTP协议与您的Tomcat服务器通信。如果您将代码部署在Azure(App Service)等云提供商上,则会遇到此问题。
对于任何面临此问题的人,以下是解决方案:
在application.properties文件中,添加以下内容。注意:某些属性在 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();

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

balp4ylt

balp4ylt2#

Ranbir已经很好地解释了有人会面临这个问题的用例。
我不需要在我的springboot项目中添加任何额外的属性,我只需要添加ForwardedHeaderFilter作为spring配置的一部分,并提到我希望这个过滤器作用于x-forwarded头的URL:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import javax.servlet.DispatcherType;
import org.springframework.core.Ordered;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.web.filter.ForwardedHeaderFilter;

import java.security.Security;
import java.util.Arrays;

@SpringBootApplication(scanBasePackages = {"com.abc.xyz"})
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
        log.info("--- Security Overrides ---");
        log.info("networkaddress.cache.ttl =" + Security.getProperty("networkaddress.cache.ttl"));
    }

    @Bean
    public FilterRegistrationBean<ForwardedHeaderFilter> forwardedHeaderFilter() {
        ForwardedHeaderFilter filter = new ForwardedHeaderFilter();
        FilterRegistrationBean<ForwardedHeaderFilter> registration = new FilterRegistrationBean<>(filter);
        registration.setDispatcherTypes(javax.servlet.DispatcherType.REQUEST, DispatcherType.ASYNC, DispatcherType.ERROR);
        registration.setOrder(Ordered.HIGHEST_PRECEDENCE);
        registration.setUrlPatterns(Arrays.asList("/app/*", "/ping", "/oauth2/authorization/callback", "/oauth/callback"));
        return registration;
    }

}

以下是一些有用的参考资料:https://tomgregory.com/spring-boot-behind-load-balancer-using-x-forwarded-headers/
https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#filters-forwarded-headers
https://docs.spring.io/spring-boot/docs/2.0.1.RELEASE/reference/htmlsingle/#howto-enable-https

相关问题