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.