当重定向到https时,我在我的URL中获得双根上下文

时间:2016-03-26 12:54:11

标签: spring tomcat redirect

我使用Eclipse(Spring Tool Suite)创建了一个HelloWorld Spring MVC应用程序。它有一个Controller和一个jsp。该应用程序显示" Hello World!"在网页上。我不会发布这个代码(除非被问到),因为它是微不足道的,不重要的。我正在使用Pivotal tc Server Developer Edition v3.1(随Spring Tool Suite一起提供)。

所以,我添加Spring 4安全性,保护root(requiresChannel()。antMatchers(" /")。requiresSecure();)并部署。

我输入了这个" http://localhost:8081/helloWorld/"进入我的浏览器,我被重定向到" http://localhost:8081/helloWorld/helloWorld/"。

我使用了tc-server / tomcat中的所有默认值。我一无所获。

我猜测Tomcat正在这样做,我必须关闭Tomcat重定向,因为我使用Spring进行重定向。有人有什么想法吗?

package com.test.security;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter
{
  @Override
  protected void configure(AuthenticationManagerBuilder auth) throws     Exception
  {
    System.out.println(System.getProperty("env"));
    if(System.getProperty("env").equals("dit"))
    {
      auth.inMemoryAuthentication()
        .withUser("user").password("user").roles("USER").and()
        .withUser("admin").password("admin").roles("USER", "ADMIN");
    }
    else if(System.getProperty("env").equals("sit"))
    {
      auth.inMemoryAuthentication()
      .withUser("user").password("user").roles("USER").and()
      .withUser("admin").password("admin").roles("USER", "ADMIN");
    }
    else if(System.getProperty("env").equals("uat"))
    {
      auth.inMemoryAuthentication()
      .withUser("user").password("user").roles("USER").and()
      .withUser("admin").password("admin").roles("USER", "ADMIN");
    }
    else if(System.getProperty("env").equals("prd"))
    {
      auth.inMemoryAuthentication()
      .withUser("user").password("user").roles("USER").and()
      .withUser("admin").password("admin").roles("USER", "ADMIN");
    }
  }

  @Override
  protected void configure(HttpSecurity http) throws Exception
  {
    http.authorizeRequests()
          .anyRequest().permitAll()
        .and()
        .formLogin()
        .and()
        .httpBasic()
        .and()
        .requiresChannel()
           .antMatchers("/").requiresSecure();
  }

1 个答案:

答案 0 :(得分:0)

我已经弄明白了。

我工作的公司认为在我们的计算机上运行8080的过程是合适的。这意味着我必须使用8080以外的端口。我使用8083。 所以我期待requiresChannel从端口8083切换到端口8443.需要明确告知HttpSecurity从不安全端口到安全的映射。默认情况下,它将80到443和8080映射到8443.如果您需要除默认值以外的其他内容,则必须告诉HttpSecurity。请参阅下面的示例。

@Configuration
@EnableWebSecurity
public class PortMapperSecurityConfig extends WebSecurityConfigurerAdapter
{
    @Override
    protected void configure(HttpSecurity http) throws Exception
    {
       http.authorizeRequests().antMatchers("/**").hasRole("USER").and().formLogin()
            .permitAll().and()
            .portMapper().http(8083).mapsTo(8443).http(80).mapsTo(443);
    }

  @Override
  protected void configure(AuthenticationManagerBuilder auth) throws Exception
  {
    auth.inMemoryAuthentication().withUser("user").password("password").roles("USER");
  }

}