web-dev-qa-db-ja.com

Spring Security:複数のHTTP構成が機能しない

Spring Securityを使用しようとしていますが、別のログインページと別のURLのセットを保護したい場合があります。

これが私の設定です:

@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");
    }
}

これらのクラスは、注釈@EnableWebSecurityを持つ別のクラスMultipleHttpSecurityConfigの内部クラスです。

admin/**のセキュリティは正常に機能していますが、consumer/**ページは保護されておらず、ログインページのリダイレクトは行われていません。他の回答を検索しましたが、うまくいきませんでした。

19
Mohan Singh

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通常どおり認証を構成する

2 WebSecurityConfigurerAdapterのインスタンスを作成して@Orderを含め、どのWebSecurityConfigurerAdapterを最初に考慮するかを指定します。

3 http.antMatcherには、このHttpSecurity/api/で始まるURLにのみ適用されると記載されています

4 WebSecurityConfigurerAdapterの別のインスタンスを作成します。 URLが/api/で始まらない場合、この構成が使用されます。この構成は、@Orderの後に1値があるため、ApiWebSecurityConfigurationAdapterの後に考慮されます(@Orderはデフォルトで持続しません)。

最初の構成は/**に一致するため(2つの構成は使用されません)(antMatcherは構成されていません)。また、最初の構成では/admin/**のみが制限され、他のすべてのURLはデフォルトで許可されています。

21
dur

最初のWebSecurityConfigurerAdapter

http
            .authorizeRequests()

すべてのURLに一致し、antMatcherを使用して、/adminで始まるURLのみに制限します。

@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