Spring Security - Faixa de IP da lista de permissões

Spring Security - Faixa de IP da lista de permissões

1. Visão geral

Neste tutorial,we’ll discuss how to whitelist IP ranges in Spring Security.

Vamos dar uma olhada nas configurações Java e XML. Também veremos como colocar o intervalo de IP na lista de permissões usando umAuthenticationProvider personalizado.

2. Configuração Java

Primeiro, vamos explorar a configuração Java.

We can use hasIpAddress() to allow only users with a given IP address to access a specific resource.

Aqui está uma configuração de segurança simples usandohasIpAddress():

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

    // ...

}

Nesta configuração, apenas usuários com o endereço IP "11.11.11.11" poderão acessar o recurso "/ foos". Também não há necessidade de os usuários com o IP na lista de permissões fazer login antes de acessar o URL “/ foos /”.

Se quisermos que os usuários com IP "11.11.11.11" efetuem login primeiro, podemos usar o método em uma expressão do formulário:

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

3. Configuração XML

A seguir, vamos ver como colocar um intervalo de IP na lista de permissões usando a configuração XML:

UsaremoshasIpAddress() aqui também:


    
    
    
    


// ...

4. Teste ao vivo

Agora, aqui está um teste simples ao vivo para garantir que tudo está funcionando corretamente.

Primeiro, vamos garantir que qualquer usuário possa acessar a página inicial após o login:

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

Em seguida, vamos garantir que mesmo os usuários autenticados não consigam acessar o recurso “/ foos”, a menos que seu IP esteja na lista de permissões:

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

Observe que não podemos acessar o recurso "/ foos" do localhost "127.0.0.1", pois apenas usuários com "11.11.11.11" podem acessá-lo.

5. Whitelisting usando umAuthenticationProvider personalizado

Finalmente,we’ll see how to whitelist an IP range by building a custom AuthenticationProvider.

Vimos como podemos usarhasIpAddress() para colocar um intervalo de IP na lista de permissões e como combiná-lo com outras expressões. Mas às vezes,we need more customization.

No exemplo a seguir, temos vários endereços IP na lista de permissões e apenas usuários desses endereços IP podem efetuar login no nosso sistema:

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

Agora, usaremos nossoCustomIpAuthenticationProvider em nossa configuração de segurança:

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

}

Aqui, usamos o métodoWebAuthenticationDetails getRemoteAddress() para obter o endereço IP de um usuário.

Como resultado, apenas usuários com IP na lista de permissões poderão acessar nosso sistema.

Esta é uma implementação básica, mas podemos personalizar nossoAuthenticationProvider o quanto quisermos usando o IP de um usuário. Por exemplo, podemos armazenar o endereço IP com os detalhes do usuário na inscrição e compará-lo durante a autenticação em nossoAuthenticationProvider.

6. Conclusão

Aprendemos como colocar na lista branca um intervalo de IPs do Spring Security usando a configuração Java e XML. Também aprendemos como colocar um intervalo de IP na lista de permissões criando umAuthenticationProvider personalizado.

O código-fonte completo pode ser encontradoover on GitHub.