Рубрики
Без рубрики

IP – диапазон Spring Security-Белый список

Узнайте, как внести диапазон IP-адресов в белый список в конфигурации безопасности Spring.

Автор оригинала: baeldung.

1. Обзор

В этом уроке мы обсудим, как внести диапазоны IP-адресов в белый список в Spring Security .

Мы рассмотрим конфигурации Java и XML. Мы также увидим, как внести диапазон IP-адресов в белый список с помощью пользовательского Поставщика аутентификации .

2. Конфигурация Java

Во-первых, давайте рассмотрим конфигурацию Java.

Мы можем использовать имеет Ip-адрес () , чтобы разрешить доступ к определенному ресурсу только пользователям с заданным IP-адресом .

Вот простая конфигурация безопасности с использованием имеет Ip-адрес() :

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
          .antMatchers("/login").permitAll()
          .antMatchers("/foos/**").hasIpAddress("11.11.11.11")
          .anyRequest().authenticated()
          .and()
          .formLogin().permitAll()
          .and()
          .csrf().disable();
    }

    // ...

}

В этой конфигурации только пользователи с IP-адресом “11.11.11.11” смогут получить доступ к ресурсу “/foos”. Кроме того, пользователям с IP-адресом, включенным в белый список, нет необходимости входить в систему до того, как они получат доступ к URL-адресу “/food/”.

Если мы хотим, чтобы пользователи с IP-адресом “11.11.11.11” сначала вошли в систему, мы можем использовать метод в виде выражения:

//...
.antMatchers("/foos/**")
.access("isAuthenticated() and hasIpAddress('11.11.11.11')")
//...

3. Конфигурация XML

Далее давайте посмотрим, как внести в белый список диапазон IP-адресов с помощью конфигурации XML:

Мы также будем использовать имеет Ip-адрес() здесь:


    
    
    
    


// ...

4. Живой Тест

Теперь вот простой живой тест, чтобы убедиться, что все работает правильно.

Во-первых, мы позаботимся о том, чтобы любой пользователь мог получить доступ к домашней странице после входа в систему:

@Test
public void givenUser_whenGetHomePage_thenOK() {
    Response response = RestAssured.given().auth().form("john", "123")
      .get("http://localhost:8082/");

    assertEquals(200, response.getStatusCode());
    assertTrue(response.asString().contains("Welcome"));
}

Затем мы позаботимся о том, чтобы даже аутентифицированные пользователи не могли получить доступ к ресурсу “/foos”, если их IP-адрес не внесен в белый список:

@Test
public void givenUserWithWrongIP_whenGetFooById_thenForbidden() {
    Response response = RestAssured.given().auth().form("john", "123")
      .get("http://localhost:8082/foos/1");

    assertEquals(403, response.getStatusCode());
    assertTrue(response.asString().contains("Forbidden"));
}

Обратите внимание, что мы не можем получить доступ к ресурсу “/food” с локального хоста “127.0.0.1”, так как только пользователи с “11.11.11.11” могут получить к нему доступ.

5. Белый список С использованием пользовательского поставщика проверки подлинности

Наконец, мы увидим, как внести диапазон IP-адресов в белый список, создав пользовательский Поставщик аутентификации .

Мы видели, как мы можем использовать имеет Ip-адрес() для занесения в белый список диапазона IP-адресов и как смешивать его с другими выражениями. Но иногда/| нам нужно больше настроек .

В следующем примере у нас есть несколько IP-адресов, занесенных в белый список, и только пользователи с этих IP-адресов могут войти в нашу систему:

@Component
public class CustomIpAuthenticationProvider implements AuthenticationProvider {
    
   Set whitelist = new HashSet();

    public CustomIpAuthenticationProvider() {
        whitelist.add("11.11.11.11");
        whitelist.add("12.12.12.12");
    }

    @Override
    public Authentication authenticate(Authentication auth) throws AuthenticationException {
        WebAuthenticationDetails details = (WebAuthenticationDetails) auth.getDetails();
        String userIp = details.getRemoteAddress();
        if(! whitelist.contains(userIp)){
            throw new BadCredentialsException("Invalid IP Address");
        }
        //...
}

Теперь мы будем использовать наш Пользовательский поставщик аутентификации по Ip-адресу в нашей конфигурации безопасности:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private CustomIpAuthenticationProvider authenticationProvider;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
       auth.authenticationProvider(authenticationProvider);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
          .antMatchers("/login").permitAll()
          .anyRequest().authenticated()
          .and().formLogin().permitAll()
          .and().csrf().disable();
    }

}

Здесь мы использовали метод WebAuthenticationDetails getRemoteAddress() для получения IP-адреса пользователя.

В результате только пользователи с IP-адресом, внесенным в белый список, смогут получить доступ к нашей системе.

Это базовая реализация, но мы можем настроить вашего Поставщика аутентификации столько, сколько захотим, используя IP-адрес пользователя. Например, мы можем сохранить IP-адрес с данными пользователя при регистрации и сравнить его во время аутентификации в нашем Поставщике аутентификации.

6. Заключение

Мы узнали, как внести диапазон IP-адресов в белый список в Spring Security, используя конфигурацию Java и XML. Мы также узнали, как внести в белый список диапазон IP-адресов, создав пользовательский Поставщик аутентификации .

Полный исходный код можно найти на GitHub .