无法了解Spring安全性的行为

时间:2019-06-26 21:33:18

标签: java spring spring-boot spring-security

我正在使用带有执行器依赖项的Spring Boot 2.1.4。我想为执行器和我的应用程序配置单独的身份验证和授权机制。我阅读了Multiple HttpSecurity并按如下方式配置了WebSecurityAdapter:

@Configuration
public class ProvisioningServiceSecurityConfiguration {

  @Value("${actuator.user.name}")
  private String actuatorUserName;

  @Value("${actuator.password}")
  private String actuatorPassword;

  @Value("${actuator.role}")
  private String actuatorRole;

  @Bean
  public UserDetailsService userDetailsService() throws Exception {
    // ensure the passwords are encoded properly
    UserBuilder users = User.withDefaultPasswordEncoder();
    InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
    manager.createUser(users.username("user").password("password").roles("ADMIN").build());
    manager.createUser(
        users.username(actuatorUserName).password(actuatorPassword).roles(actuatorRole).build());
    return manager;
  }

  @Configuration
  @Order(1)
  public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {

    protected void configure(HttpSecurity http) throws Exception {
      http
          .antMatcher("/locations/**")
          .antMatcher("/organizations/**")
          .antMatcher("/productTypes/**")
          .authorizeRequests()
          .anyRequest().hasRole("ADMIN")
          .and()
          .httpBasic();
    }
  }

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

    protected void configure(HttpSecurity http) throws Exception {
      http
          .antMatcher("/manage/**")
          .authorizeRequests()
          .anyRequest().hasRole("ACTUATOR_ADMIN")
          .and()
          .httpBasic();
    }
  }

  /*@Configuration
  public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

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

}

注意:我已禁用表单临时登录

当我执行卷曲请求

curl -XGET  http://localhost:9797/provisioningService/organizations/all

我能够看到输出。好像弹簧安全性从未存在过。启用表单登录后,将显示spring登录屏幕。我观察到的另一个行为是,如果将/ locations的用户名和密码与执行器的用户名和密码互换,我仍然会收到有效的响应。

我知道表单登录更多的是回退,但是我想禁用表单登录(可能我们可能会改用cas),并且仅基于Spring Security httpBasic使用身份验证和授权。我无法理解我正在犯的错误。

我的要求终于是:

1)仅当用户名密码为“ user”和“ password”时,才可以访问对/ organizations或/ locations等的请求

2)仅当用户名和密码以及角色与执行器用户名和密码相匹配时,才可以访问作为执行器api的对/ manage的请求。

3)任何其他API都可以被允许使用all /表单登录

我该如何实现这一目标?

1 个答案:

答案 0 :(得分:0)

1)Spring Security具有通过权限(在身份验证之后)进行过滤来控制访问的功能,但是没有用于对登录所需信息进行过滤的功能。您需要业务逻辑来验证您是否在登录期间尝试使用相应的ID和密码登录。

2)如上所述,未提供具有ID和密码的访问控制。 我建议仅为您请求的两个帐户创建“单位”。

3).antMatcher("/form").permitAll()