Spring Boot基于HTTP动词+ URL模式区分authN / authZ

时间:2019-04-08 16:45:18

标签: spring-boot security

我想在Spring Boot应用程序中基于http谓词和url模式切换身份验证和授权方案,以下是我的用例的简化。

大多数/ mgmt / ...请求将根据基本身份验证进行授权。

某些/ mgmt / ...将是公开开放的,不需要身份验证。

任何先前未定义的路径,都应忽略/阻止。

我的计划是定义规则并按顺序评估它们。 对于本示例中使用的那些规则,将按顺序评估三个规则,将首先使用匹配项。

GET /mgmt/configuration/** -> Publicly open (anonymous)
ANY /mgmt/** -> ADMIN role user
ANY /** -> deny

我对public和admin的规则有疑问,特别是它们重叠(都以/ mgmt开头)。 如果我将public置于其自己的上下文路径(/ public)下,则以下代码有效-但我不想这样做(也无法控制这些模式)。

也许我需要按上下文路径而不是认证方案对配置程序进行分组。配置实际上不是此示例中的静态对象,而是来自其他模块(微服务)的配置,它们被组装在安全性库中,以尝试集中身份验证代码。

@EnableWebSecurity
public class MultiHttpSecurityConfig {
  private static final String MGMT_PATTERN = "/mgmt/**";
  private static final String PUBLIC_PATTERN = "/public/**";


  @Configuration
  @Order(1)
  public static class PublicConfigurationAdapter extends WebSecurityConfigurerAdapter {
    protected void configure(HttpSecurity http) throws Exception {
      http.antMatcher(PUBLIC_PATTERN).authorizeRequests().anyRequest().permitAll();
    }
  }

  @Configuration
  @Order(2)
  public static class AdminConfigurationAdapter extends WebSecurityConfigurerAdapter {
    protected void configure(HttpSecurity http) throws Exception {


      http.antMatcher(MGMT_PATTERN)
          .authorizeRequests().anyRequest()
          .hasRole("ADMIN")
          .and()
          .httpBasic()
          .and().csrf().disable()
          .sessionManagement()
          .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }

    /**
     * Some operation.
     *
     * @return some value.
     */
    @Bean
    public UserDetailsService userDetailsService() {
      PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
      UserDetails user = User.withUsername("user")
          .password(encoder.encode("password"))
          .roles("ADMIN").build();
      InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
      manager.createUser(user);
      return manager;

    }
  }

  @Configuration
  @Order(3)
  public static class DenyConfigurationAdapter extends WebSecurityConfigurerAdapter {
    protected void configure(HttpSecurity http) throws Exception {
      http.antMatcher("/**").authorizeRequests().anyRequest().denyAll();

    }
  }
}

1 个答案:

答案 0 :(得分:0)

我更改了配置,并按url模式(而不是类型)将它们分组,这解决了我的不同配置相互重叠的问题。