Spring Security:多个HTTP配置无法正常工作

时间:2015-11-09 05:43:45

标签: java spring security spring-mvc spring-security

我正在尝试使用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");
    }
}

这些类是另一个具有注释MultipleHttpSecurityConfig的类@EnableWebSecurity的内部类。

admin/**的安全性工作正常,但consumer/**个页面都没有安全保护,登录页面也没有重定向。我已经搜索了其他答案,但都没有。

2 个答案:

答案 0 :(得分:16)

查看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的{​​{1}}实例,以指定应首先考虑@Order

     

3 WebSecurityConfigurerAdapter表示此http.antMatcher仅适用于以HttpSecurity开头的网址

     

4创建/api/的另一个实例。如果URL不以WebSecurityConfigurerAdapter开头,则将使用此配置。此配置在/api/之后考虑,因为它在ApiWebSecurityConfigurationAdapter之后具有@Order值(默认值为1)。

未使用您的第二个配置,因为您的第一个配置与@Order匹配(未配置/**)。并且您的第一个配置仅限制antMatcher,默认情况下允许所有其他网址。

答案 1 :(得分:14)

您的第一个WebSecurityConfigurerAdapter

http
            .authorizeRequests()

匹配所有网址,使用/admin将其限制为仅以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()

                ...