spring安全:多个http配置不起作用

py49o6xq  于 2021-07-14  发布在  Java
关注(0)|答案(2)|浏览(354)

我正在尝试使用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/** 页面是安全的,登录页面没有重定向。我寻找过其他的答案,但没有一个有效。

k10s72fa

k10s72fa1#

查看spring安全参考:

@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/ 4创建另一个 WebSecurityConfigurerAdapter . 如果url不是以 /api/ 将使用此配置。此配置在 ApiWebSecurityConfigurationAdapter 因为它有一个 @Order 之后的值 1 (否) @Order 默认为最后一个)。
第二个配置未使用,因为第一个配置匹配 /** (否) antMatcher 已配置)。你的第一个配置 /admin/** ,默认情况下允许所有其他URL。

i2loujxw

i2loujxw2#

你的第一个 WebSecurityConfigurerAdapter

http
            .authorizeRequests()

匹配所有URL,将其限制为仅以开头的URL /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()

                ...

相关问题