Spring Security - Plage d’adresses IP de la liste blanche

Spring Security - Plage IP de la liste blanche

1. Vue d'ensemble

Dans ce didacticiel,we’ll discuss how to whitelist IP ranges in Spring Security.

Nous examinerons les configurations Java et XML. Nous verrons également comment ajouter une plage d'adresses IP à la liste blanche à l'aide d'unAuthenticationProvider personnalisé.

2. Configuration Java

Tout d'abord, explorons la configuration Java.

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

Voici une configuration de sécurité simple utilisanthasIpAddress():

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

    // ...

}

Dans cette configuration, seuls les utilisateurs ayant l'adresse IP «11.11.11.11» pourront accéder à la ressource «/ foos». Il n'est pas non plus nécessaire pour les utilisateurs disposant de l'adresse IP de la liste blanche de se connecter avant d'accéder à l'URL "/ foos /".

Si nous voulons que les utilisateurs dotés de l’adresse «11.11.11.11» se connectent d’abord, nous pouvons utiliser la méthode dans une expression de la forme suivante:

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

3. Configuration XML

Voyons ensuite comment ajouter une plage d'adresses IP à la liste blanche à l'aide de la configuration XML:

Nous utiliserons égalementhasIpAddress() ici:


    
    
    
    


// ...

4. Test en direct

Maintenant, voici un simple test en direct pour vous assurer que tout fonctionne correctement.

Tout d'abord, nous nous assurerons que tout utilisateur peut accéder à la page d'accueil après la connexion:

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

Ensuite, nous nous assurerons que même les utilisateurs authentifiés ne peuvent pas accéder à la ressource "/ foos" à moins que leur adresse IP ne figure sur la liste blanche:

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

Notez que nous ne pouvons pas accéder à la ressource "/ foos" à partir de l'hôte local "127.0.0.1" car seuls les utilisateurs disposant de "11.11.11.11" peuvent y accéder.

5. Liste blanche à l'aide d'unAuthenticationProvider personnalisé

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

Nous avons vu comment nous pouvons utiliserhasIpAddress() pour ajouter une plage d'adresses IP à la liste blanche et comment la mélanger avec d'autres expressions. Mais parfois,we need more customization.

Dans l'exemple suivant, nous avons plusieurs adresses IP sur liste blanche et seuls les utilisateurs de ces adresses IP peuvent se connecter à notre système:

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

Maintenant, nous allons utiliser nosCustomIpAuthenticationProvider dans notre configuration de sécurité:

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

}

Ici, nous avons utilisé la méthodeWebAuthenticationDetails getRemoteAddress() pour obtenir l’adresse IP d’un utilisateur.

En conséquence, seuls les utilisateurs avec une adresse IP sur liste blanche pourront accéder à notre système.

Il s’agit d’une implémentation de base, mais nous pouvons personnaliser nosAuthenticationProvider autant que nous le voulons en utilisant l’IP d’un utilisateur. Par exemple, nous pouvons stocker l'adresse IP avec les détails de l'utilisateur lors de l'inscription et la comparer lors de l'authentification dans nosAuthenticationProvider.

6. Conclusion

Nous avons appris comment ajouter à la liste blanche une plage d'adresses IP dans Spring Security à l'aide de la configuration Java et XML. Nous avons également appris à mettre sur liste blanche une plage IP en créant unAuthenticationProvider personnalisé.

Le code source complet peut être trouvéover on GitHub.