/ api-url在Spring Boot Security中有一个空的filter列表

具有REST服务的Spring Boot应用程序必须允许公共访问某些服务,同时将其他服务限制为仅授权用户。 当如下所示将configure(WebSecurity web)方法添加到SecurityConfig类时,会向用户的Web浏览器发送403 error ,并且Spring Boot日志文件会发出错误消息,指出:

 /registration-form has an empty filter list 

需要对下面的代码进行哪些具体更改才能使/registration-form服务成功提供给任何用户,包括匿名/未经身份validation的用户?

这是SecurityConfig类:

 @Configuration @Order(SecurityProperties.ACCESS_OVERRIDE_ORDER) @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) protected static class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Override public void configure(WebSecurity webSecurity) throws Exception { webSecurity.ignoring().antMatchers("/registration-form"); } @Override protected void configure(HttpSecurity http) throws Exception { http .formLogin() .and() .httpBasic().and() .authorizeRequests() .antMatchers("/login1").permitAll() .antMatchers("/login2").permitAll() .anyRequest().authenticated(); } } 

这是完整的日志:

 2016-04-07 16:42:18.548 INFO 8937 --- [nio-8001-exec-1] oaccC[Tomcat].[localhost].[/] : Initializing Spring FrameworkServlet 'dispatcherServlet' 2016-04-07 16:42:18.548 INFO 8937 --- [nio-8001-exec-1] osweb.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization started 2016-04-07 16:42:18.656 INFO 8937 --- [nio-8001-exec-1] osweb.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization completed in 108 ms 2016-04-07 16:42:18.702 DEBUG 8937 --- [nio-8001-exec-1] osswumatcher.AntPathRequestMatcher : Checking match of request : '/registration-form'; against '/css/**' 2016-04-07 16:42:18.702 DEBUG 8937 --- [nio-8001-exec-1] osswumatcher.AntPathRequestMatcher : Checking match of request : '/registration-form'; against '/js/**' 2016-04-07 16:42:18.702 DEBUG 8937 --- [nio-8001-exec-1] osswumatcher.AntPathRequestMatcher : Checking match of request : '/registration-form'; against '/images/**' 2016-04-07 16:42:18.702 DEBUG 8937 --- [nio-8001-exec-1] osswumatcher.AntPathRequestMatcher : Checking match of request : '/registration-form'; against '/**/favicon.ico' 2016-04-07 16:42:18.702 DEBUG 8937 --- [nio-8001-exec-1] osswumatcher.AntPathRequestMatcher : Checking match of request : '/registration-form'; against '/error' 2016-04-07 16:42:18.702 DEBUG 8937 --- [nio-8001-exec-1] osswumatcher.AntPathRequestMatcher : Checking match of request : '/registration-form'; against '/registration-form' 2016-04-07 16:42:18.702 DEBUG 8937 --- [nio-8001-exec-1] ossecurity.web.FilterChainProxy : /registration-form has an empty filter list 

pom.xml ,对安全性的唯一引用如下:

   org.springframework.boot spring-boot-starter-security  

我在pom.xml查找了一个版本号,我能找到的最接近的是:

  org.springframework.boot spring-boot-starter-parent 1.3.0.RELEASE    

正在进行的研究:


1.) 这篇文章很好地解释了WebSecurityHttpSecurity之间的区别,从而解释了为什么我在上面显示的代码中包含了WebSecurityHttpSecurity

2.) 这篇2012年的post描述了一个类似的错误和解决方案 ,但是通常使用xml configuration专注于旧版本的Spring Security,而不是特定于使用Java Configuration Spring Boot。

3.) 这篇博客文章解释了像web.xml这样的旧xml配置文件在很大程度上被Spring Boot中的新application.properties文件所取代 。 因此,我不确定当前问题的解决方案是添加一些application.properties ,还是添加一些Java Config for Spring Security。

4.) 这篇博客文章描述了使用@Bean注释注入一个ServletContextInitializer bean,它将一个filter添加到一个端点,该端点由Spring Boot Controller类中的@RequestMapping注释描述。 该示例是一个多部分文件filter,但我想知道是否可以使用此方法添加适当的filter来解决当前的OP错误消息。

5.) 这篇2014年的post描述了两种在Spring Boot中自定义ServletContextInitializer行为的方法 。 一种方法是让Application.java类扩展SpringBootServletInitializer ,然后覆盖configure()onStartup()方法。 显示的另一种方法是使用server命名空间向application.properties文件添加行。 此链接提供了可在application.properties设置的公共属性列表,但我无法确定要设置哪些属性来解决当前OP定义的问题。

6.)@ DaveSyer 对此相关问题的回答建议在application.properties设置endpoints.info.sensitive=true以使所有端点都打开。 这让我从Spring找到关于端点的这个文档页面 ,建议在application.properties设置endpoints.name.sensitive=false ,其中name是要更改的endpoints.name.sensitive=false的名称。 但是在application.properties中设置endpoints.api-url.sensitive=false并不能解决问题,eclipse会发出警告,指出endpoints.api-url.sensitive=false is an unknown property 。 我是否必须在其他地方定义属性映射,或者可能添加/以使其成为endpoints./api-url.sensitive=false ? 如何获得用于/api-url端点的正确名称,这是解决此问题的正确方法吗?

7.)我读了这篇文章 ,并使用它的例子在Spring Boot应用程序的主Application类中创建了一个Filter Registration Bean ,但调试日志仍显示相同的消息,表明/api-url has an empty filter list 。 这是我添加到Application类的代码:

 @Bean public FilterRegistrationBean shallowEtagHeaderFilter() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new ShallowEtagHeaderFilter()); registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class)); registration.addUrlPatterns("/api-url"); return registration; } 

这项研究的可能方法包括:

 1.) adding something to `application.properties` 2.) adding `@Bean` annotation to inject a `ServletContextInitializer` 3.) adding some Spring Security config using Java Configuration. 4.) having Application.java extend SpringBootServletInitializer and then overriding methods. 5.) adding @Bean annotation to add a filter registration bean 

这就是我限制一些URL的地方,有些是公开的

  @Override public void configure(HttpSecurity http) throws Exception { http.csrf().disable() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .authorizeRequests() .antMatchers(actuatorEndpoints()).hasRole(userConfig.getAdminRole()) .antMatchers(HttpMethod.OPTIONS, "/**").permitAll() .antMatchers("/signup", "/payment/confirm", "/api/address/zipcodes/**", "/user/password/reset", "/user/password/change", "/user/email/verify", "/password/update", "/email/verify", "/new-products/**").permitAll() .antMatchers("/api/**", "/files/**").authenticated(); } 

我认为你所做的是使/ error视图成为受保护的资源。 打开它或者停止使用@EnableWebSecurity (它会关闭一些弹簧启动会为你做的事情)。