2015-10-02 63 views
2

我嘗試創建使用的球衣和春季安全SpringBoot應用。 我想用基本認證來保護我的整個應用程序。 我的安全配置:春季啓動與新澤西基本驗證總是404

@Configuration 
@EnableWebSecurity 
@EnableGlobalMethodSecurity(jsr250Enabled = true, securedEnabled = true, prePostEnabled = true) 
public class WebSerucityConfig extends WebSecurityConfigurerAdapter { 
    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
    http.authorizeRequests().anyRequest().authenticated().and().httpBasic(); 
    @Override 
    public void configure(WebSecurity web) throws Exception { 
     web.debug(true); 
    } 

    @Autowired(required = false) 
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
     auth 
      .inMemoryAuthentication() 
      .withUser("user").password("password").roles("USER").and() 
      .withUser("admin").password("password").roles("USER", "ADMIN"); 
    } 
} 

我的球衣控制器:

@Component 
@Path("/") 
public class Home { 

    @GET 
    @Produces("application/json") 
    public String list() { 
     String email = (String) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
     return email; 
    } 
} 

沒有春季安全(如果我允許所有的請求),應用控制器運行,但如果我能httpBasic驗證我總是HTTP 404。

有什麼想法?

回答

4

這是因爲新澤西州和Spring MVC是映射到相同的地方 - 到根上下文「/」。

檢查日誌:春天的分派Servlet是新澤西州的Servlet(檢查你的日誌ServletRegistrationBean短語)後註冊。

和情景是:

  1. 您使用curl
  2. 新澤西試圖處理你的請求,但HTTP 401錯誤未經授權出現
  3. 現在的Spring MVC試圖處理您的請求發送例如請求
  4. 但是你還沒有在Spring MVC中配置這個特定的上下文,所以Http Error 404沒有出現

這就是爲什麼你總是有這404

最簡單的解決方法是在你的application.properties

server.servlet-path=/some_context_for_spring_mvc 

它使澤西將被映射到根「/」,但添加屬性的Spring MVC到some_context_for_spring_mvc - 現在Jersey和Spring MVC之間的衝突消失了。在春季啓動關於Spring MVC

更多細節,你可以在這裏找到:

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-switch-off-the-spring-mvc-dispatcherservlet

春季啓動要滿足您的應用程序的根目錄的所有內容/向下。如果你寧願自己的servlet映射到URL,你可以做到這一點,當然,你可能會失去一些其他引導MVC功能。要添加自己的servlet和其映射到根資源只是申報類型的Servlet的@Bean,並給它特殊的bean名字的DispatcherServlet(如果你想將其關閉,您還可以創建不同類型的具有該名稱的bean並不能取代它)。

我希望這會有所幫助。