Перейти к основному содержимому

Spring Security — диапазон IP-адресов в белом списке

· 3 мин. чтения

1. Обзор

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

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

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

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

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

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

@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-адресу «/foos/».

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

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

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

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

Здесь мы также будем использовать hasIpAddress() :

<security:http>
<security:form-login/>
<security:intercept-url pattern="/login" access="permitAll()" />
<security:intercept-url pattern="/foos/**" access="hasIpAddress('11.11.11.11')" />
<security:intercept-url pattern="/**" access="isAuthenticated()" />
</security:http>

// ...

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"));
}

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

5. Внесение в белый список с использованием пользовательского AuthenticationProvider

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

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

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

@Component
public class CustomIpAuthenticationProvider implements AuthenticationProvider {

Set<String> whitelist = new HashSet<String>();

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");
}
//...
}

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

@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();
}

}

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

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

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

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

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

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