Commit c5fd8152 authored by 李文彬's avatar 李文彬

feat(*): 开启 ip 白名单限制

parent 3e95d329
package cn.quantgroup.xyqb.constant;
import lombok.Getter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;
/**
* @author hyuk
*/
@Getter
@RefreshScope
@Component
public class IpLimiterProperties {
@Value("${extranet.known.ips:123.56.31.54}")
private String[] extranetIps;
}
package cn.quantgroup.xyqb.controller.api.v2;
import cn.quantgroup.xyqb.constant.IpLimiterProperties;
import cn.quantgroup.xyqb.model.JsonResult;
import com.alibaba.fastjson.JSON;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
......@@ -34,7 +36,7 @@ public class IpLimitController {
}
String status = stringRedisTemplate.opsForValue().get(IP_LIMIT_STATUS_KEY);
if (StringUtils.isEmpty(status)) {
status = "1";
status = "0";
}
return JsonResult.buildSuccessResult("success", status);
}
......@@ -50,4 +52,12 @@ public class IpLimitController {
stringRedisTemplate.opsForValue().set(IP_LIMIT_STATUS_KEY, status);
return JsonResult.buildSuccessResult("success", status);
}
private final IpLimiterProperties ipLimiterProperties;
@GetMapping("/properties")
public JsonResult<String> getProperties() {
return JsonResult.buildSuccessResult("success", JSON.toJSONString(ipLimiterProperties.getExtranetIps()));
}
}
......@@ -2,7 +2,9 @@ package cn.quantgroup.xyqb.filter;
import cn.hutool.core.date.DateUtil;
import cn.hutool.extra.servlet.ServletUtil;
import cn.quantgroup.xyqb.constant.IpLimiterProperties;
import cn.quantgroup.xyqb.util.IpUtil;
import com.alibaba.fastjson.JSON;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
......@@ -20,6 +22,7 @@ import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
......@@ -33,12 +36,10 @@ import static cn.quantgroup.xyqb.controller.api.v2.IpLimitController.IP_LIMIT_ST
@Configuration
public class IpLimitFilter implements Filter {
@Getter
@Value("${extranet.known.ips:123.56.31.54}")
private String[] extranetIps;
private final StringRedisTemplate stringRedisTemplate;
private final IpLimiterProperties ipLimiterProperties;
// 1. 日 IP 访问次数
static final String DAY_IP_COUNT_KEY = "xyqb_user:01:ip_limit:day_count:00cs:%s";
......@@ -75,16 +76,22 @@ public class IpLimitFilter implements Filter {
filterChain.doFilter(servletRequest, servletResponse);
return;
}
log.info("[IpLimitFilter]外网调用, clientIp : {}, uri : {}", clientIp, request.getRequestURI());
String uri = request.getRequestURI();
if (Objects.equals(uri, "/api/captcha/new")) {
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
if (request.getRequestURI().startsWith("/ip/limit")) {
filterChain.doFilter(servletRequest, servletResponse);
return;
}
filterChain.doFilter(servletRequest, servletResponse);
return;
Map<String, String[]> parameterMap = request.getParameterMap();
String status = stringRedisTemplate.opsForValue().get(IP_LIMIT_STATUS_KEY);
log.info("[IpLimitFilter]外网调用, clientIp : {}, uri : {}, params : {}, status : {}", clientIp, request.getRequestURI(),
JSON.toJSONString(parameterMap), status);
if (status == null || Objects.equals(status, "0")) {
filterChain.doFilter(servletRequest, servletResponse);
} else {
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
}
return;
// String status = stringRedisTemplate.opsForValue().get(IP_LIMIT_STATUS_KEY);
// if (status == null || Objects.equals(status, "1")) {
// filterChain.doFilter(servletRequest, servletResponse);
......@@ -117,7 +124,7 @@ public class IpLimitFilter implements Filter {
}
private boolean isInExtranet(String clientIp) {
for (String extranetIp : extranetIps) {
for (String extranetIp : ipLimiterProperties.getExtranetIps()) {
if (clientIp.startsWith(extranetIp)) {
return true;
}
......@@ -129,4 +136,4 @@ public class IpLimitFilter implements Filter {
public void destroy() {
}
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment