Невозможно понять поведение безопасности Spring - PullRequest
0 голосов
/ 27 июня 2019

Я использую пружинную загрузку 2.1.4 с зависимостями привода.Я хотел настроить отдельные механизмы аутентификации и авторизации для привода и моего приложения.Я прочитал Множественный 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

Я могу видеть вывод.Как будто весенней безопасности никогда не существовало.Когда я включаю форму входа в систему, я получаю весенний экран входа в систему.Другое поведение, которое я наблюдал, заключается в том, что если я поменяю имя пользователя и пароль / местоположения на имя пользователя и пароль привода, я все равно получу верный ответ.

Я понимаю, что форма входа в систему является скорее запасным вариантом, но я хочу отключить форму входа в систему (возможно, мы можем перейти на cas) и использовать аутентификацию и авторизацию только на основе весенней безопасности httpBasic.Я не могу понять ошибку, которую я делаю.

Мое требование наконец-то:

1) запрос к / организациям / / местам и т. Д. Должен быть доступен только в том случае, если в качестве имени пользователя используется пароль «user» и «password»

2) запрос / управление, которое является API-интерфейсом привода, должен быть доступен только в том случае, если имя пользователя, пароль и роль совпадают с именем пользователя и паролем привода.

3) Может быть разрешен любой другой API. Все / форма логина

Как мне добиться этого?

1 Ответ

0 голосов
/ 27 июня 2019

1) Spring Security имеет функцию для контроля доступа путем фильтрации по полномочиям (после аутентификации), но нет функции для фильтрации по информации, необходимой для входа в систему. Вам нужна бизнес-логика, чтобы убедиться, что вы пытаетесь войти с соответствующим ID и паролем во время входа в систему.

2) Как упоминалось выше, контроль доступа с идентификатором и паролем не предоставляется. Я рекомендую создавать полномочия только для двух учетных записей, которые вы запрашивали.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...