2015-04-21 14 views
6

Ho un filtro di autenticazione personalizzato che crea PreAuthenticatedAuthenticationToken e lo memorizza nel contesto di sicurezza. Il filtro funziona bene, crea il token con le autorizzazioni appropriate autorizzate "ROLE_user" e "ROLE_adminuser". Ecco la mia configurazione:PreAuthorize e Custom AuthenticationFilter with Spring boot

@Configuration 
@EnableWebMvcSecurity 
@EnableGlobalMethodSecurity(prePostEnabled = true) 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     X509AuthenticationFilter filter = new X509AuthenticationFilter() 
     filter.setAuthenticationManager(authenticationManager()) 
     http.addFilterAfter(filter, SecurityContextPersistenceFilter.class) 
     http.authorizeRequests().anyRequest().permitAll() 
    } 

    @Bean 
    public FilterRegistrationBean filterRegistrationBean() { 
     FilterRegistrationBean registrationBean = new FilterRegistrationBean() 
     X509AuthenticationFilter filter = new X509AuthenticationFilter() 
     filter.setAuthenticationManager(authenticationManager()) 
     registrationBean.setFilter(filter) 
     registrationBean.setEnabled(false) 
     return registrationBean 
    } 

sto inserendo il filtro prima della SecurityContextPersistenceFilter come accennato in: Spring security and custom AuthenticationFilter with Spring boot.

Questo sembra funzionare bene, tuttavia, quando si tenta di aggiungere un'annotazione pre-autorizzare per il mio metodo di controllo, in questo modo:

@Controller 
@RequestMapping("/security") 
class SecurityController { 

    @RequestMapping("/authenticate") 
    @PreAuthorize("hasRole('ROLE_user')") 
    @ResponseBody 
     ResponseEntity<String> authenticate(HttpServletRequest request,  Principal principal) { 
     println "authenticate: " +  SecurityContextHolder.getContext().getAuthentication() 

     return new ResponseEntity<String>(getPreAuthenticatedPrincipal(request), HttpStatus.OK) 
    } 

ottengo un errore 404. Se commento l'annotazione PreAuthorize, la chiamata al metodo funziona e puoi vedere che stampo le informazioni di autenticazione e l'utente autenticato ha ROLE_user e ROLE_adminuser per le sue autorizzazioni concesse. Non sono sicuro di cosa sto sbagliando.

Ecco la stampa fuori dell'oggetto autenticazione principale quando "pre-autorizzare" è commentata:

Authenticate: org.springframework.security[email protected]817a0240: Principal : or[email protected]c279eab8: Dn: uid = 1, ou = persone, dc = cdpe, dc = mil; Nome utente: [email protected]; Password: [PROTETTO]; Abilitato: true; AccountNonExpired: true; CredenzialiNonExpired: true; AccountNonLocked: true; Concesso Autorità: ROLE_adminuser, ROLE_user; Credenziali: [PROTETTO]; Autenticato: true; Dettagli: org.sprin[email protected]957e: RemoteIpAddress: 127.0.0.1; SessionId: null; Concesso Autorità: ROLE_adminuser, autorità ROLE_USER: [ROLE_adminuser, ROLE_USER]

Aggiornamento: Ho fatto un piccolo progresso. Ho aggiunto il proxyTargetClass per la seguente annotazione:

@EnableGlobalMethodSecurity(prePostEnabled = true, proxyTargetClass = true) 

Ora sto ricevendo 403 ritorna Forbidden quando chiamo il mio metodo. Non ho idea di cosa stia facendo.

risposta

7

Hmm, Primavera di sicurezza è sempre noioso da configurare, e gli unici modi fooproof sono:

  • o essere un esperto su di esso ed essere pronti a cercare nelle fonti e allora si può fare cose difficili mano
  • oppure utilizzare il più possibile a quanto previsto dal quadro utilizzando esempi dalla documentazione quando possibile

Per la configurazione di un X509AuthenticationFilter, HttpSecurity javadoc dà il metodo x509 con seguente esempio (adattato alla propria configurazione - vedere javadoc per un originale):

@Configuration 
@EnableWebMvcSecurity 
@EnableGlobalMethodSecurity(prePostEnabled = true) 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {  

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
      .authorizeRequests().anyRequest().permitAll() 
      // Example x509() configuration 
      .x509(); 
    } 
} 

con seguente indicazione: metodo restituisce il X509Configurer per ulteriori personalizzazioni.

A meno che non si abbia una buona ragione per fare diversamente (e se è il caso, per favore dillo), ti consiglio vivamente di attenersi a questo metodo.

Ma è davvero una cattiva idea usare l'annotazione pre-post su un controller, per quello che potrebbe essere fatto direttamente nella configurazione HttpSecurity. Ti ha costretto a usare proxyTargetClass = true.

Le annotazioni pre e post sono normalmente applicate ai metodi del livello di servizio che non richiedono proxyTargetClass=true poiché i servizi sono normalmente collegati al controller tramite interfacce che consentono il proxy JDK.

0

Grazie per il vostro aiuto. Per questo esempio sono costretto a riutilizzare un filtro personalizzato di sicurezza Spring già funzionante. Sto solo cercando di farlo funzionare nel contesto dello spring-boot.

L'aggiunta del proxyTargetClass = true al codice precedente sembra aver risolto il problema.