2015-01-05 11 views
28

Nello specificoPrimavera di sicurezza HTTP di base per la riposante e FormLogin (cookie) per il web - Annotazioni

voglio avere HTTP di base l'autenticazione solo per un motivo specifico URL.

In dettaglio

Sto creando un'interfaccia API per la mia applicazione e che ha bisogno di essere autenticato da semplice autenticazione HTTP di base. Ma altre pagine web dovrebbero non utilizzare HTTP basic ma piuttosto il login del modulo normale .

Configurazione attuale - Non funziona

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http //HTTP Security 
      .csrf().disable() //Disable CSRF 
      .authorizeRequests() //Authorize Request Configuration 
       .antMatchers("/connect/**").permitAll() 
       .antMatchers("/", "/register").permitAll() 
       .antMatchers("/admin/**").hasRole("ADMIN") 
       .antMatchers("/api/**").hasRole("API") 
       .anyRequest().authenticated() 
      .and() //HTTP basic Authentication only for API 
       .antMatcher("/api/**").httpBasic() 
      .and() //Login Form configuration for all others 
       .formLogin().loginPage("/login").permitAll() 
      .and() //Logout Form configuration 
       .logout().permitAll(); 

} 

risposta

41

Abbiamo aspettato per 2 giorni e non ha ottenuto alcun aiuto qui. Ma la mia ricerca mi ha fornito una soluzione :)

Soluzione

@Configuration 
@EnableWebMvcSecurity 
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true, proxyTargetClass = true) 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{ 

    @Autowired 
    private AuthenticationProvider authenticationProvider; 

    @Autowired 
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
     auth.authenticationProvider(authenticationProvider); 
    } 

    @Configuration 
    @Order(1) 
    public static class ApiWebSecurityConfig extends WebSecurityConfigurerAdapter{ 
     @Override 
     protected void configure(HttpSecurity http) throws Exception { 
      http.csrf().disable() 
        .antMatcher("/api/**") 
        .authorizeRequests() 
         .anyRequest().hasAnyRole("ADMIN", "API") 
         .and() 
        .httpBasic(); 
     } 
    } 

    @Configuration 
    @Order(2) 
    public static class FormWebSecurityConfig extends WebSecurityConfigurerAdapter{ 

     @Override 
     public void configure(WebSecurity web) throws Exception { 
      web.ignoring().antMatchers("/css/**", "/js/**", "/img/**", "/lib/**"); 
     } 

     @Override 
     protected void configure(HttpSecurity http) throws Exception { 
      http.csrf().disable() //HTTP with Disable CSRF 
        .authorizeRequests() //Authorize Request Configuration 
         .antMatchers("/connect/**").permitAll() 
         .antMatchers("/", "/register").permitAll() 
         .antMatchers("/admin/**").hasRole("ADMIN") 
         .anyRequest().authenticated() 
         .and() //Login Form configuration for all others 
        .formLogin() 
         .loginPage("/login").permitAll() 
         .and() //Logout Form configuration 
        .logout().permitAll(); 
     } 
    } 
} 
+0

Come posso rimuovere quel popup http auth di base. Ho provato tutto ma non sono riuscito a farlo. – 89n3ur0n

+0

non utilizzare httpBasic, utilizzare formLogin. –

+0

ha provato che senza successo, l'ho disabilitato da httpBasic(). Disable() e usato formLogin(), ma non sembra essere corretto. – 89n3ur0n

0

Non so se può essere utile, ma non ho potuto implementare la soluzione di cui sopra. Ho trovato una soluzione alternativa che definisce un unico Security

classe @Configuration

estendere

WebSecurityConfigurerAdapter

sia con httpBasic() e FormLogin() configurato. Poi ho creato una consuetudine

CustomAuthEntryPoint implementa AuthenticationEntryPoint

che ha questa logica nel metodo commence:

@Override 
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException 
    { 
     String urlContext = UtilityClass.extractUrlContext(request); 
     if (!urlContext.equals(API_URL_PREFIX)) 
     { 
      String redirectUrl = "urlOfFormLogin" 
      response.sendRedirect(request.getContextPath() + redirectUrl); 
     } 
     else 
     { 
      response.sendError(HttpServletResponse.SC_UNAUTHORIZED); 
     } 

Boh, che è la "strategia migliore prassi" su questo problema

Problemi correlati