2016-04-07 8 views
6

Un'app di avvio Spring con servizi REST deve consentire l'accesso pubblico a determinati servizi, limitando gli altri servizi solo agli utenti autorizzati. Quando un metodo configure(WebSecurity web) viene aggiunto alla classe SecurityConfig come illustrato di seguito, un 403 error viene inviato al browser web dell'utente, ei file di registro primavera Boot danno un errore che indica che:/api-url ha un elenco di filtri vuoto in Spring Boot Security

/registration-form has an empty filter list 

Quali cambiamenti specifici devono essere fatto al codice qui sotto per ottenere il servizio /registration-form per essere servito con successo a qualsiasi utente, compresi gli utenti anonimi/non autenticati?

Ecco la classe 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(); 
    } 
} 

E qui è il log completo:

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

Nel pom.xml, l'unico riferimento per la sicurezza è la seguente:

<dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-security</artifactId> 
    </dependency> 

Ho cercato un numero di versione nel pom.xml, e la cosa più vicina che ho trovato è stato:

<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.3.0.RELEASE</version> 
    <relativePath /> <!-- lookup parent from repository --> 
</parent> 

di ricerca in corso:


1.) This other post dà una buona spiegazione della differenza tra WebSecurity e HttpSecurity, e quindi spiega perché ho incluso sia WebSecurity e HttpSecurity nel mio codice mostrato sopra.

2.) This 2012 post describes a similar error and solution, ma si concentra su una vecchia versione di Spring Security in generale utilizzando xml configuration e non è specifico per Spring Boot con Java Configuration.

3.) This blog entry explains that old xml config files like web.xml are largely replaced by the new application.properties file in Spring Boot. Pertanto non sono sicuro che la soluzione al problema attuale sia nell'aggiunta di qualcosa application.properties o nell'aggiunta di Java Config per Spring Security.

4.) This blog entry descrive usando l'@Bean nota per iniettare un bean ServletContextInitializer che aggiunge un filtro per un punto finale che è stato descritto da @RequestMapping nota in una classe Boot Controller Spring. L'esempio è un filtro di file multiparte, ma mi chiedo se questo approccio possa essere utilizzato per aggiungere un filtro appropriato per risolvere il messaggio di errore dell'OP corrente.

5.) This 2014 posting describes two approaches to customizing the behavior of a ServletContextInitializer in Spring Boot. Un approccio consiste nell'avere la classe Application.java estendere SpringBootServletInitializer e quindi sovrascrivere i metodi configure() e onStartup(). L'altro approccio mostrato consiste nell'aggiungere linee al file application.properties utilizzando lo spazio dei nomi server. Un elenco di proprietà comuni che è possibile impostare in application.properties viene fornito con at this link, ma non è stato possibile determinare quali proprietà impostare per risolvere il problema definito dall'OP corrente.

6.) @ La risposta di DaveSyer allo this related question suggerisce di impostare endpoints.info.sensitive=true in application.properties per rendere TUTTI gli endpoint aperti. Ciò mi ha portato a trovare this documentation page from Spring about endpoints, che suggerisce di impostare endpoints.name.sensitive=false in application.properties, dove name è il nome del punto finale da modificare. Ma l'impostazione di endpoints.api-url.sensitive=false in application.properties non risolve il problema ed eclissi fornisce un avviso che indica endpoints.api-url.sensitive=false is an unknown property. Devo definire la mappatura delle proprietà da qualche altra parte, o forse aggiungere il / per renderlo endpoints./api-url.sensitive=false? Come posso ottenere il nome corretto da usare per l'endpoint /api-url e questo è l'approccio corretto per risolvere questo problema?

7.) ho letto this other posting e usato il suo esempio per creare un Filter Registration Bean all'interno della principale Application classe di app Primavera di avvio, ma i registri di debug mostrano ancora lo stesso messaggio che indica che il /api-url has an empty filter list. Ecco il codice che ho aggiunto alla classe 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; 
} 

I possibili approcci di questa ricerca includono:

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 
+0

Un elenco di filtri vuoto non è un errore (è stato chiesto di essere ignorato). La sicurezza di primavera non sta inviando il 403. È necessario scoprire da dove proviene (magari all'interno del servizio di registrazione stesso)? –

+0

@DaveSyer Grazie mille. Puoi per favore suggerire come determinare da dove viene il messaggio? Forse un link? Ho intenzione di passare l'intera giornata a lavorare su questo domani. – CodeMed

+0

Hai già i log DEBUG per Spring Security, quindi se non lo vedi lì non ho suggerimenti, mi dispiace. Forse dovresti fare un semplice progetto di esempio. –

risposta

1

Questo è quello che ho in cui limito alcuni URL e alcuni sono pubblici

@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(); 
     } 
+0

Ciò non ha comportato il flusso di controllo all'interno del servlet. Invece, ha appena etichettato l'utente come 'ROLE_ANONYMOUS' e ha rifiutato l'accesso al servlet per i motivi mostrati in' 1.) 'nella mia sezione ** IN CORSO DI RICERCA ** mostrata sopra nel mio OP. – CodeMed

+0

L'unica modifica apportata al codice, oltre alla localizzazione di '/ url-patterns', consisteva nel commentare l'unica riga: // // antMatchers (actuatorEndpoints()). HasRole (userConfig.getAdminRole())' – CodeMed

0

Penso che quello che hai fatto sia stato visualizzato/errore da una risorsa protetta. O aprilo o smetti di usare @EnableWebSecurity (spegne alcune cose che il boot primaverile avrebbe fatto per te altrimenti).

+0

Questi suggerimenti non hanno risolto il problema. Tuttavia, sto perseguendo l'obiettivo più grande seguendo uno dei tuoi altri esempi di codice. – CodeMed

+0

Mi sto avvicinando a questo stesso problema decomprimendo un'app che hai sviluppato personalmente. Sei disposto a dare un'occhiata a una domanda che ho su di esso? Ecco il link: http://stackoverflow.com/questions/36655518/disable-confirmation-page-in-spring-oauth2 – CodeMed

Problemi correlati