W kolejnym etapie bojów ze Spring-Security dotarłem do etapu w którym potrzebuje w ramach jednej aplikacji zabezpieczyć część URLi przy pomocy formularza logowania (interfejs użytkownika) a część przez HttpBasic (dostęp do API). Przeszukałem pół StackOverflow w poszukiwaniu rozwiązania ale to co tam znajduje generalnie nie działa.

Generalnie sugeruje się aby w klasie rozszerzającej WebSecurityConfigurerAdapter stworzyć dwie klasy statyczne, również rozszerzające WebSecurityConfigurerAdapter . Każdą z nich zrobić z adnotacją @Order i niby to ma działać. U mnie wygląda to tak jak poniżej. Podczas uruchamiania Springa wywołują się obydwie metody z obydwu klas ale autoryzacja nie działa tak jak powinna.

Generalnie działa zawsze ta, która jest uruchamiania jako pierwsza. Czyli mam albo login form albo HttpBasic. Nie udało mi się uzyskać działania jednej i drugiej konfiguracji w tym samym momencie. Próbowałem różnych sztuczek z przenoszeniem metody configure pomiędzy klasami i umieszczania jednej z nich bezpośrednio w mojej SecurityConfig ale bez zmian..

 @Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
	
    @Autowired
    private CustomAuthenticationProvider authProvider;

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

    @Configuration
    @Order(2)
    private static class HttpBasicConfig extends WebSecurityConfigurerAdapter {
    	
    	HttpBasicConfig() {
    		
    	}
    	
    	@Override
    	protected void configure(HttpSecurity http) throws Exception {
    
    		http.
    			logout().
    				logoutUrl("/logout").
    				logoutSuccessUrl("/public").
    		and().
    			authorizeRequests().
        			antMatchers("/").hasRole("role1").
    		and().
    			httpBasic();
    
    	}

    }
    
    @Configuration
    @Order(1)   
    private static class LoginFormConfig extends WebSecurityConfigurerAdapter {
    	
    	LoginFormConfig() {
    		
    	}
    	
    	@Override
    	protected void configure(HttpSecurity http) throws Exception {

    		http.authorizeRequests().
    			antMatchers("/private/**").hasRole("role2").
    		and().
    			formLogin();

    	}   	
    	
    }
    

}