Spring Security - Whitelist-IP-Bereich

Frühjahrssicherheit - Whitelist IP-Bereich

1. Überblick

In diesem Tutorial werdenwe’ll discuss how to whitelist IP ranges in Spring Security.

Wir werden uns sowohl die Java- als auch die XML-Konfiguration ansehen. Wir werden auch sehen, wie der IP-Bereich mithilfe eines benutzerdefiniertenAuthenticationProvider auf die Whitelist gesetzt wird.

2. Java-Konfiguration

Lassen Sie uns zunächst die Java-Konfiguration untersuchen.

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

Hier ist eine einfache Sicherheitskonfiguration mithasIpAddress():

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

    // ...

}

In dieser Konfiguration können nur Benutzer mit der IP-Adresse "11.11.11.11" auf die Ressource "/ foos" zugreifen. Benutzer mit der IP-Adresse auf der Whitelist müssen sich nicht anmelden, bevor sie auf die URL "/ foos /" zugreifen können.

Wenn wir möchten, dass sich Benutzer mit der IP-Adresse "11.11.11.11" zuerst anmelden, können wir die Methode in einem Ausdruck des Formulars verwenden:

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

3. XML-Konfiguration

Als Nächstes sehen wir uns an, wie Sie einen IP-Bereich mithilfe der XML-Konfiguration auf die Whitelist setzen:

Wir werden auch hierhasIpAddress() verwenden:


    
    
    
    


// ...

4. Live-Test

Hier ist ein einfacher Live-Test, um sicherzustellen, dass alles ordnungsgemäß funktioniert.

Zunächst stellen wir sicher, dass jeder Benutzer nach der Anmeldung auf die Startseite zugreifen kann:

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

Als Nächstes stellen wir sicher, dass auch authentifizierte Benutzer nur dann auf die Ressource "/ foos" zugreifen können, wenn ihre IP-Adresse auf der Whitelist steht:

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

Beachten Sie, dass wir von localhost "127.0.0.1" nicht auf die Ressource "/ foos" zugreifen können, da nur Benutzer mit "11.11.11.11" darauf zugreifen können.

5. Whitelisting mit einem benutzerdefiniertenAuthenticationProvider

Schließlichwe’ll see how to whitelist an IP range by building a custom AuthenticationProvider.

Wir haben gesehen, wie wirhasIpAddress() verwenden können, um einen IP-Bereich auf die Whitelist zu setzen und ihn mit anderen Ausdrücken zu mischen. Aber manchmalwe need more customization.

Im folgenden Beispiel sind mehrere IP-Adressen in der Positivliste aufgeführt, und nur Benutzer dieser IP-Adressen können sich bei unserem System anmelden:

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

Jetzt verwenden wir unsereCustomIpAuthenticationProviderin unserer Sicherheitskonfiguration:

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

}

Hier haben wir dieWebAuthenticationDetails getRemoteAddress()-Methode verwendet, um die IP-Adresse eines Benutzers zu erhalten.

Infolgedessen können nur Benutzer mit einer IP-Adresse auf der Whitelist auf unser System zugreifen.

Dies ist eine grundlegende Implementierung, aber wir können unsereAuthenticationProvider beliebig anpassen, indem wir die IP eines Benutzers verwenden. Zum Beispiel können wir die IP-Adresse mit Benutzerdetails bei der Anmeldung speichern und sie während der Authentifizierung in unserenAuthenticationProvider. vergleichen

6. Fazit

Wir haben gelernt, wie Sie einen IP-Bereich in Spring Security mithilfe der Java- und XML-Konfiguration auf die Positivliste setzen. Wir haben auch gelernt, wie man einen IP-Bereich auf die Whitelist setzt, indem man benutzerdefinierteAuthenticationProvider erstellt.

Der vollständige Quellcode istover on GitHub.