2015-05-29 3 views
6

che sto cercando di utilizzare l'URL (formica based) corrispondenza con @PreAuthorize ("permitAll") su alcuni controller cioèPrimavera di sicurezza @PreAuthorize sui controller

@Controller 
@RequestMapping("/register") 
public class RegistrationController { 
... 

    @PreAuthorize("permitAll") 
    @RequestMapping(method = RequestMethod.GET) 
    public String register() { ... } 

SecurityConfig:

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

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     // @formatter:off 
     http 
      .authorizeRequests() 
       .antMatchers("/").permitAll() 
       .anyRequest().authenticated() 

ho anche provato ad aggiungere @EnableGlobalMethodSecurity alla mia MVC config:

@Configuration 
@EnableGlobalMethodSecurity(prePostEnabled = true) 
public class MvcConfig extends WebMvcConfigurerAdapter { ... } 

Ma questo non ha alcun effetto

Tuttavia, mi viene comunque richiesto di autenticarsi quando si preme/si registra. Se aggiungo "/ register" agli ant matcher funziona come .antMatchers ("/", "/ register"). AllowAll()

Cosa mi manca qui? Sembra che @PreAuthorize non abbia alcun effetto sui miei controller

+0

Dovrei chiarire che @PreAuthorize ("hasRole ('ADMIN')") su un controller funziona: i non-admins avranno un errore 403. Il problema è in particolare su come sovrascrivere l'ant matcher con l'annotazione @PreAuthorize –

risposta

8

Non è possibile farlo perché i formatori di corrispondenze e @PreAuthorize funzionano a un livello diverso.

Gli ant matcher funzionano a livello di sicurezza http. Il filtro di sicurezza Spring esamina la richiesta e, se rileva che l'accesso deve essere negato, non passa nemmeno la richiesta al servlet del dispatcher e invia direttamente un errore 403.

PreAuthorize lavoro al livello metodo. Quando un metodo sta per essere chiamato, un proxy AOP controlla se l'accesso deve essere consentito. Quindi il livello di 2 autorizzazioni è concatenato, anziché il secondo che ignora il primo.

In ogni caso, io consiglio vivamente di nonutilizzare @PreAuthorize("hasRole('ADMIN')") su un controller:

  • si può facilmente essere fatto con un semplice matcher formica
  • ti costringe a consentire l'inoltro su un controller, sia con classe proxy invece di JDK proxy o utilizzando interfacce per controller

IMHO, @PreAuthorize è più adatto al livello di servizio, perché si può mescolare dominio o bject con le autorizzazioni degli utenti per ottenere autorizzazioni a grana fine.

+1

Thanls Serge, Il motivo per cui avevo intenzione di usare le annotazioni era di mantenere le cose semplici e mantenibili, al momento ho bisogno di mappare "/ register", "/ registrati/"e"/register/* "nella configurazione di sicurezza e se cambio la mappatura della richiesta devo cambiarli anche. –