2015-11-05 11 views
7

Ho il seguente metodo esempio nel mio Repository (con @RepositoryRestResource annotazione):@PreAuthorize (permitAll) richiede ancora l'autenticazione

@Override 
@PreAuthorize("permitAll") 
@PostAuthorize("permitAll") 
public Iterable<User> findAll(); 

Ma sto ancora ricevendo 401 Unauthorized, evento quando aggiungo quelli permitAll annotazione intero Interfaccia del repository.

Ho ottenuto questo come il mio WebSecurityConfigurerAdapter:

@EnableWebSecurity 
@EnableGlobalMethodSecurity(prePostEnabled = true) 
@Configuration 
class WebSecurityConfig extends WebSecurityConfigurerAdapter { 
    @Override 
    protected void configure(final HttpSecurity http) throws Exception { 
     http.authorizeRequests().anyRequest().fullyAuthenticated().and().httpBasic().and().csrf().disable(); 
    } 
} 

Suppongo che questo ha la precedenza su quelle annotazioni metodo, bu non so come risolvere questo problema.

+0

Forse hai mancato la parentesi in "permitAll'. Prova 'permitAll()' –

+0

Hai veramente bisogno di queste annotazioni? Cosa succede quando li rimuovi? –

risposta

4

La sicurezza del metodo viene applicata dopo il filtro di sicurezza Web.

Dato che nella configurazione è presente il anyRequest().fullyAuthenticated(), il metodo findAll non verrà colpito. anyRequest().fullyAuthenticated() significa che tutti i tentativi di accesso a un endpoint Web di cui non si dispone di un'autenticazione utente completa su di esso avranno esito negativo.

Dal JavaDoc

specificare che gli URL sono consentiti dagli utenti che hanno autenticati ed erano non è "ricordato".

È necessario aggiungere un ulteriore percorso nella sicurezza Web, ad esempio.

protected void configure(final HttpSecurity http) throws Exception { 
    http.authorizeRequests() 
      .anyRequest().fullyAuthenticated() 
      .antMatchers(HttpMethod.GET, '/somePath').permitAll() 
     .and() 
      .httpBasic() 
     .and() 
      .csrf().disable(); 
} 
+0

È davvero l'unico modo? Voglio dire, mantenere il percorso in due punti è disordinato. Non c'è modo di annotare gli endpoint che non devono essere protetti? – Cleankod

+1

Il problema è che si tratta di due sistemi di sicurezza completamente separati che vengono eseguiti in momenti diversi. – Leon

Problemi correlati