tgoop.com/javaproglib/6743
Create:
Last Update:
Last Update:
🎯 Как настроить фильтрацию запросов с помощью Spring Security и IP-блокировки
Для улучшения безопасности вашего приложения можно настроить фильтрацию запросов с использованием Spring Security, а также внедрить блокировку определённых IP-адресов.
В файл pom.xml добавьте следующие зависимости:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Создайте фильтр, который будет проверять IP-адрес пользователя и блокировать его, если он находится в списке запрещённых:
@Component
public class IpFilter extends OncePerRequestFilter {
private static final Set<String> blockedIps = new HashSet<>(Arrays.asList("192.168.1.100", "10.0.0.5"));
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
String ipAddress = request.getRemoteAddr();
if (blockedIps.contains(ipAddress)) {
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
response.getWriter().write("Access Denied: Your IP is blocked.");
return;
}
filterChain.doFilter(request, response);
}
}
Теперь настроим Spring Security, чтобы наш фильтр IP-блокировки применялся ко всем входящим запросам:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private IpFilter ipFilter;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/public/**").permitAll() // Доступ для публичных ресурсов
.anyRequest().authenticated() // Остальные запросы требуют аутентификации
.and()
.addFilterBefore(ipFilter, UsernamePasswordAuthenticationFilter.class); // Вставляем фильтр IP
}
}
Создадим простой контроллер с двумя маршрутами: один доступен всем пользователям, а другой требует аутентификации:
@RestController
public class TestController {
@GetMapping("/public/hello")
public String publicHello() {
return "Hello from public endpoint!";
}
@GetMapping("/private/hello")
public String privateHello() {
return "Hello from private endpoint, you are authenticated!";
}
}
Этот подход не является универсальной защитой от всех типов атак. Он помогает ограничить доступ для определённых IP-адресов, но не защищает от более сложных угроз, таких как атаки с подменой IP (например, через прокси-серверы).
Для более комплексной защиты используйте дополнительные механизмы, такие как WAF, анти-DDoS системы, а также более детальную настройку доступа через роли и права.