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
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)? –
@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
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. –