2015-07-20 97 views
0

我移动了一些我的应用程序并创建了单独的模块,但现在由于某种原因,当我尝试启用HTTPS时,它将请求发送到无限重定向循环...当在弹簧安全中配置安全通道时循环重定向

有人可能会建议为什么这个请求http://myhost/login会发出重定向。这是我认为是相关的配置。请注意,如果我拿出requiresChannel部分,它工作正常。

@Override 
protected void configure(HttpSecurity http) throws Exception { 

    http 
      //.addFilterBefore(systemAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class) 
      .addFilter(systemAuthenticationFilter()) 
      .addFilter(new RememberMeAuthenticationFilter(authenticationManager(), rememberMeService())) 
      .authorizeRequests() 
      .antMatchers("/login","/welcome", "/login/new**", "/register", "/logout", "/**", "/session/timeout", "/admin/assets/**").permitAll() 
      .antMatchers("/my_account").hasRole("REGISTERED_CUSTOMER") 
      .anyRequest().permitAll() 
      .and() 
      .formLogin() 
      .failureHandler(exceptionMappingAuthenticationFailureHandler()) 
      .loginPage("/login") 
      .loginProcessingUrl("/log_in") 
      .defaultSuccessUrl("/welcome") 
      .usernameParameter("username") 
      .passwordParameter("password") 

      .and() 
      .logout() 
      .logoutUrl("/logout") 
      .logoutSuccessUrl("/login") 
      .deleteCookies("SPRING_SECURITY_REMEMBER_ME_COOKIE") 


      .and() 
      .requiresChannel() 
      .antMatchers("/my_account", "/login").requiresSecure() 
      .and() 
      .rememberMe() 
      .tokenValiditySeconds(1209600) 
      .key(env.getProperty("rememberme.key")) 

    ; 

} 

哦也,此模块,从web.xml中servlet上下文的相关部分:

<servlet-mapping> 
     <servlet-name>Spring MVC Dispatcher Servlet</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 
    <filter> 
     <filter-name>encoding-filter</filter-name> 
     <filter-class> 
      org.springframework.web.filter.CharacterEncodingFilter 
     </filter-class> 
     <init-param> 
      <param-name>encoding</param-name> 
      <param-value>UTF-8</param-value> 
     </init-param> 
     <init-param> 
      <param-name>forceEncoding</param-name> 
      <param-value>true</param-value> 
     </init-param> 
    </filter> 
    <filter-mapping> 
     <filter-name>encoding-filter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 


    <filter> 
     <display-name>springMultipartFilter</display-name> 
     <filter-name>springMultipartFilter</filter-name> 
     <filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>springMultipartFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <filter> 
     <display-name>springSecurityFilterChain</display-name> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <url-pattern>/*</url-pattern> 
     <dispatcher>ERROR</dispatcher> 
     <dispatcher>FORWARD</dispatcher> 
     <dispatcher>REQUEST</dispatcher> 
    </filter-mapping> 

回答

0

我不知道你的情况是一样的,但我已经遇到了类似的在Pivotal Cloud Foundry部署我的Spring Boot应用程序时出现问题。看来,PaaS代理服务器将https重定向到http。添加一对夫妇在我application.properties行的固定问题:

server.tomcat.remote_ip_header=x-forwarded-for 
server.tomcat.protocol_header=x-forwarded-proto 

我已经在博客它here,如果有帮助。

0

我今天再次在这个问题上花时间。事实证明,当我重新部署应用程序时,我更改了HTTP端口,以便可以运行旧版本。

在Tomcat配置有一个在连接器本节:

<Connector executor="tomcatThreadPool" 
      port="8080" protocol="HTTP/1.1" 
      connectionTimeout="20000" 
      redirectPort="8443" URIEncoding="UTF-8" /> 

我切换回原来的端口8080和它的正常工作。我不确定为什么Tomcat设置很重要,但是如果我使用的是不同于此处配置的HTTP端口的Spring端口,则Spring Security将重定向到原始HTTP端口。