在现今的网络应用中,接口的安全性是至关重要的一环。IP黑白名单机制作为一种常见的安全策略,可以有效地控制哪些IP地址可以访问我们的服务接口,哪些IP地址则被拒绝访问。本文将介绍在Spring Boot如何实施IP黑白名单限制。
设计IP黑白名单机制的主要原因是为了提高接口的安全性、可控性和灵活性。通过限制访问IP,我们可以防止恶意攻击和未经授权的访问,确保服务的稳定运行。同时,黑白名单的动态调整也为我们提供了灵活的访问控制手段。
在Spring Boot中,我们可以利用拦截器(Interceptor)机制来实现IP黑白名单限制。以下是一个简单的实现步骤和代码示例:
首先,我们需要创建一个自定义的拦截器类,实现HandlerInterceptor
接口。在preHandle
方法中,我们可以检查请求的IP地址是否在黑白名单中。
- /**
- * https://www.sanzhiwa.top/6769.html
- * 2023年张雪峰志愿填报
- */
- import org.springframework.web.servlet.HandlerInterceptor;
- import org.springframework.web.servlet.ModelAndView;
-
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
-
- public class IpBasedInterceptor implements HandlerInterceptor {
-
- private final IpUtil ipUtil;
- private final IpConfigProperties ipConfigProperties;
-
- @Autowired
- public IpBasedInterceptor(IpUtil ipUtil, IpConfigProperties ipConfigProperties) {
- this.ipUtil = ipUtil;
- this.ipConfigProperties = ipConfigProperties;
- }
-
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
- String ipAddress = ipUtil.getIpAddress(request); // 假设IpUtil能处理request以获取IP
-
- boolean isWhiteListed = isIpWhiteListed(ipAddress);
- boolean isBlackListed = isIpBlackListed(ipAddress);
-
- // 如果IP在黑名单中,拒绝访问
- if (isBlackListed) {
- response.setStatus(HttpServletResponse.SC_FORBIDDEN);
- response.getWriter().write("IP address is blacklisted. Access denied.");
- return false; // 阻止请求继续处理
- }
-
- // 如果IP不在白名单中(假设只有白名单中的IP可以访问),也拒绝访问
- if (!isWhiteListed && requiresWhitelist()) {
- response.setStatus(HttpServletResponse.SC_FORBIDDEN);
- response.getWriter().write("IP address is not whitelisted. Access denied.");
- return false; // 阻止请求继续处理
- }
-
- // 如果IP在白名单中或没有白名单要求,则允许访问
- return true;
- }
-
- @Override
- public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
- // 在请求处理之后进行调用(在视图渲染之前),可用于资源清理
- }
-
- @Override
- public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
- // 在整个请求完成后调用,即在视图渲染之后调用,用于资源清理
- }
-
- // 辅助方法
- private boolean isIpWhiteListed(String ipAddress) {
- return ipConfigProperties.getWhitelist().contains(ipAddress);
- }
-
- private boolean isIpBlackListed(String ipAddress) {
- return ipConfigProperties.getBlacklist().contains(ipAddress);
- }
-
- // 模拟方法,检查是否需要白名单
- private boolean requiresWhitelist() {
- // 根据你的应用逻辑决定是否需要白名单限制
- // 这里只是简单返回true作为示例
- return true;
- }
- }
从HTTP请求头中获取客户端IP地址的几种可能情况,包括从反向代理服务器传递的IP地址
- /**
- * https://www.sanzhiwa.top/6753.html
- * 如果历史是一群喵1-10季
- */
- import org.springframework.web.context.request.RequestContextHolder;
- import org.springframework.web.context.request.ServletRequestAttributes;
-
- import javax.servlet.http.HttpServletRequest;
- import org.apache.commons.lang3.StringUtils; // 确保导入了正确的StringUtils类
-
- public class IpUtil {
-
-
- public static String getIpAddress() {
- HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
- String ip = request.getHeader("x-forwarded-for");
- if (StringUtils.isBlank(ip)) {
- ip = request.getHeader("Proxy-Client-IP");
- }
- if (StringUtils.isBlank(ip)) {
- ip = request.getHeader("WL-Proxy-Client-IP");
- }
- if (StringUtils.isBlank(ip)) {
- ip = request.getRemoteAddr();
- }
-
- // 多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
- if (StringUtils.isNotBlank(ip) && ip.contains(",")) {
- int commaIndex = ip.indexOf(',');
- if (commaIndex > 0) {
- ip = ip.substring(0, commaIndex);
- }
- }
- return ip;
- }
- }
可以使用Spring Boot的@ConfigurationProperties
注解来绑定配置到Java对象的属性上
- /**
- * 央视推荐纪录片唤醒孩子内驱力
- * https://www.sanzhiwa.top/6750.html
- */
- import org.springframework.boot.context.properties.ConfigurationProperties;
- import org.springframework.stereotype.Component;
-
- import java.util.List;
-
- @Component
- @ConfigurationProperties(prefix = "ip")
- public class IpConfigProperties {
-
- private List
whitelist; - private List
blacklist; -
- // 标准的getter和setter方法
- public List
getWhitelist() { - return whitelist;
- }
-
- public void setWhitelist(List
whitelist) { - this.whitelist = whitelist;
- }
-
- public List
getBlacklist() { - return blacklist;
- }
-
- public void setBlacklist(List
blacklist) { - this.blacklist = blacklist;
- }
- }
然后,在application.yml
配置文件中添加IP黑白名单:
- ip:
- whitelist:
- - 192.168.1.1
- - 10.0.0.100
- blacklist:
- - 10.0.0.1
- - 172.16.0.1
在Spring Boot的配置类中,我们需要将自定义的拦截器注册到拦截器链中,并指定需要拦截的路径。
- /**
- * 央视力荐72部搞钱纪录片搞钱先搞脑
- * https://www.sanzhiwa.top/6736.html
- */
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
- import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
-
- @Configuration
- public class WebConfig implements WebMvcConfigurer {
-
- @Autowired
- private IpBasedInterceptor ipBasedInterceptor;
-
- @Override
- public void addInterceptors(InterceptorRegistry registry) {
- // 添加拦截器,并定义需要拦截的路径
- // 例如,拦截所有以"/api"开头的请求
- registry.addInterceptor(ipBasedInterceptor).addPathPatterns("/api/**");
- }
- }
IP黑白名单机制是确保接口安全性的重要措施之一。在Spring Boot中,我们可以利用拦截器机制实现IP黑白名单限制,需要我们根据实际情况进行配置和调整,以确保系统的安全性和稳定性。同时,我们也需要不断学习和掌握新的安全技术和方法,以应对日益复杂的网络安全威胁。