Spring Security - белый список IP-адресов
1. обзор
В этом руководствеwe’ll discuss how to whitelist IP ranges in Spring Security.
Мы рассмотрим конфигурации как Java, так и XML. Мы также увидим, как добавить диапазон IP-адресов в белый список с помощью настраиваемогоAuthenticationProvider.
2. Конфигурация Java
Во-первых, давайте рассмотрим конфигурацию Java.
We can use hasIpAddress() to allow only users with a given IP address to access a specific resource.
Вот простая конфигурация безопасности с использованием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():
// ...
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
Наконец,we’ll see how to whitelist an IP range by building a custom AuthenticationProvider.
Мы видели, как можно использоватьhasIpAddress() для добавления диапазона IP-адресов в белый список и как смешивать его с другими выражениями. Но иногдаwe need more customization.
В следующем примере у нас несколько белых 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");
}
//...
}
Теперь мы будем использовать наш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();
}
}
Здесь мы использовали методWebAuthenticationDetails getRemoteAddress() для получения IP-адреса пользователя.
В результате только пользователи с IP из белого списка смогут получить доступ к нашей системе.
Это базовая реализация, но мы можем настроить нашиAuthenticationProviderсколько угодно, используя IP-адрес пользователя. Например, мы можем сохранить IP-адрес с данными пользователя при регистрации и сравнить его во время аутентификации в нашемAuthenticationProvider.
6. Заключение
Мы узнали, как внести в белый список диапазон IP-адресов в Spring Security с помощью конфигурации Java и XML. Мы также узнали, как занести в белый список диапазон IP-адресов, создав пользовательскийAuthenticationProvider.
Полный исходный код можно найтиover on GitHub.