web-dev-qa-db-fra.com

Spring Security: plusieurs configurations HTTP ne fonctionnent pas

J'essaie d'utiliser Spring Security et j'ai un cas d'utilisation où je veux que différentes pages de connexion et différents ensembles d'URL soient sécurisés.

Voici ma configuration:

@Configuration
@Order(1)
public static class ProviderSecurity extends WebSecurityConfigurerAdapter{
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/home").permitAll()
                .antMatchers("/admin/login").permitAll()
                .antMatchers("/admin/**").access("hasRole('BASE_USER')")
                .and()
            .formLogin()
                .loginPage("/admin/login").permitAll()
                .defaultSuccessUrl("/admin/home")
                .failureUrl("/admin/login?error=true").permitAll()
                .usernameParameter("username")
                .passwordParameter("password")
                .and()
            .csrf()                    
                .and()
            .exceptionHandling().accessDeniedPage("/Access_Denied");            
    }
}


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

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/consumer/login").permitAll()
                .antMatchers("/consumer/**").access("hasRole('BASE_USER')")
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/consumer/login").permitAll()
                .defaultSuccessUrl("/consumer/home")
                .failureUrl("/consumer/login?error=true").permitAll()
                .usernameParameter("username")
                .passwordParameter("password")
                .and().csrf()                
                .and()
            .exceptionHandling().accessDeniedPage("/Access_Denied");
    }
}

Ces classes sont des classes internes d'une autre classe MultipleHttpSecurityConfig qui a une annotation @EnableWebSecurity.

La sécurité pour admin/** fonctionne bien, mais aucun des consumer/** les pages sont sécurisées, aucune redirection n'est en cours pour la page de connexion. J'ai cherché d'autres réponses mais aucune n'a fonctionné.

19
Mohan Singh

Regardez le Spring Security Reference :

@EnableWebSecurity
public class MultiHttpSecurityConfig {
  @Autowired
  public void configureGlobal(AuthenticationManagerBuilder auth) { 1
      auth
          .inMemoryAuthentication()
              .withUser("user").password("password").roles("USER").and()
              .withUser("admin").password("password").roles("USER", "ADMIN");
  }

  @Configuration
  @Order(1)                                                        2
  public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
      protected void configure(HttpSecurity http) throws Exception {
          http
              .antMatcher("/api/**")                               3
              .authorizeRequests()
                  .anyRequest().hasRole("ADMIN")
                  .and()
              .httpBasic();
      }
  }    

  @Configuration                                                   4
  public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

      @Override
      protected void configure(HttpSecurity http) throws Exception {
          http
              .authorizeRequests()
                  .anyRequest().authenticated()
                  .and()
              .formLogin();
      }
  }
}

1 Configurez l'authentification comme d'habitude

2 Créez une instance de WebSecurityConfigurerAdapter contenant @Order pour spécifier quel WebSecurityConfigurerAdapter doit être considéré en premier.

3 Le http.antMatcher indique que cette HttpSecurity ne sera applicable qu'aux URL commençant par /api/

4 Créez une autre instance de WebSecurityConfigurerAdapter. Si l'URL ne commence pas par /api/ cette configuration sera utilisée. Cette configuration est considérée après ApiWebSecurityConfigurationAdapter car elle a un @Order valeur après 1 (non @Order par défaut pour durer).

Votre deuxième configuration n'est pas utilisée, car votre première configuration correspond à /** (pas de antMatcher configuré). Et votre première configuration ne limite que /admin/**, toutes les autres URL sont autorisées par défaut.

21
dur

Vos premiers WebSecurityConfigurerAdapter

http
            .authorizeRequests()

correspond à toutes les URL, limitez-la aux seules URL commençant par /admin en utilisant antMatcher:

@Configuration
@Order(1)
public static class ProviderSecurity extends WebSecurityConfigurerAdapter{
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .antMatcher("/admin/**")
                .authorizeRequests()
                .antMatchers("/admin/login").permitAll()
                .antMatchers("/admin/**").access("hasRole('BASE_USER')")
                .and()

                ...
14
DiveInto