在反向代理之后,Spring Security登录重定向到错误的端口

时间:2019-04-12 19:26:04

标签: java spring spring-security

我有以下配置:

  • 启用弹簧安全性的Web应用程序,具有基于表单的登录名
    • 这在http端口8080上运行;没有https
  • 在前面运行的反向代理
    • 它在端口443上运行,并在此处终止SSL
    • 代理设置适当的标头(HostX-Forwarded-Proto

我遇到的问题是,成功登录后,Spring Security构建的重定向URL为https://server:8443/whatever。除端口外,URL正确(它是基于初始保存的请求构建的)。在此配置中,端口8443上没有任何运行。

我看到这是在Spring的PortMapperImpl中发生的。默认情况下,这里有两个映射:8080 -> 844380 -> 443

如何覆盖PortMapperImpl或实现自己的方法并强制Spring使用它?还是有其他方法可以解决此问题?

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。在Spring Java配置中:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Value("${server.port}")
    private int serverPort;

    @Value("${security.sslRedirectPort}")
    private int sslRedirectPort;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.[the usual request matchers, authorizeRequests, etc]
            .and()
            .requestCache().requestCache(requestCache());

    }

    private PortMapper portMapper() {
        PortMapperImpl portMapper = new PortMapperImpl();
        Map<String, String> mappings = Maps.newHashMap();
        mappings.put(Integer.toString(serverPort), Integer.toString(sslRedirectPort));
        portMapper.setPortMappings(mappings);
        return portMapper;
    }

    private RequestCache requestCache() {
        HttpSessionRequestCache requestCache = new HttpSessionRequestCache();
        PortResolverImpl portResolver = new PortResolverImpl();
        portResolver.setPortMapper(portMapper());
        requestCache.setPortResolver(portResolver);
        return requestCache;
    }

}

这是怎么回事:

  • 我正在使用现有的server.port设置来注入http端口(默认情况下,春季是8080)
  • 我正在创建一个名为security.sslRedirectPort的设置。将此属性设置为您要重定向到application.yaml文件中的任何内容。
  • 我创建了一个自定义RequestCache,并将其插入到spring安全配置中。在此自定义RequestCache中,我设置了PortResolver,并在其上设置了PortMapper,然后相应地设置了映射值。

现在,当我运行时,登录后会得到正确的重定向URL,端口设置为我设置的security.sslRedirectPort