diff --git a/beacon-api/src/main/java/com/mashibing/api/feignClient/CacheClient.java b/beacon-api/src/main/java/com/mashibing/api/feignClient/CacheClient.java index 3911fc7..18d43a5 100644 --- a/beacon-api/src/main/java/com/mashibing/api/feignClient/CacheClient.java +++ b/beacon-api/src/main/java/com/mashibing/api/feignClient/CacheClient.java @@ -4,6 +4,7 @@ import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.*; import java.util.Map; +import java.util.Set; /** * @author heqijun @@ -36,4 +37,6 @@ public interface CacheClient { @PostMapping("/sadd/{key}") void sadd(@PathVariable(value = "key") String key, @RequestBody Map... maps); + @PostMapping("/smember/{key}") + Set smember(@PathVariable(value = "key") String key); } diff --git a/beacon-api/src/main/java/com/mashibing/api/service/sendCheck/impl/ApikeySendCheckServiceImpl.java b/beacon-api/src/main/java/com/mashibing/api/service/sendCheck/impl/ApikeySendCheckServiceImpl.java index d313c93..c806e9b 100644 --- a/beacon-api/src/main/java/com/mashibing/api/service/sendCheck/impl/ApikeySendCheckServiceImpl.java +++ b/beacon-api/src/main/java/com/mashibing/api/service/sendCheck/impl/ApikeySendCheckServiceImpl.java @@ -31,11 +31,11 @@ public class ApikeySendCheckServiceImpl implements SendCheckService { @Override public void check(StandardSubmit submit) { - log.info("【api模块】发送短信前,apikey校验。。。"); + log.info("【接口模块】发送短信前,apikey校验。。。"); Map clientBusinessMap = (Map) cacheClient.hget(CacheConstant.CLIENT_BUSINESS + submit.getApikey()); - log.info("缓存中查询到客户信息:{}", clientBusinessMap); + log.info("【接口模块】缓存中查询到客户信息:{}", clientBusinessMap); if (MapUtils.isEmpty(clientBusinessMap)) { - log.error("apikey校验不通过:{},{}", submit.getApikey(), ExceptionEnums.ERROR_APIKEY.getMsg()); + log.error("【接口模块】apikey校验不通过:{},{}", submit.getApikey(), ExceptionEnums.ERROR_APIKEY.getMsg()); throw new ApiException(ExceptionEnums.ERROR_APIKEY); } @@ -44,7 +44,6 @@ public class ApikeySendCheckServiceImpl implements SendCheckService { // BeanUtils.copyProperties(clientBusiness, submit); submit.setClientId(clientBusiness.getId()); // submit.setIpAddress(clientBusiness.getIpAddress()); - - log.info("apikey校验通过:{}", submit.getApikey()); + log.info("【接口模块】apikey校验通过:{}", submit.getApikey()); } } diff --git a/beacon-api/src/main/java/com/mashibing/api/service/sendCheck/impl/SignSendCheckServiceImpl.java b/beacon-api/src/main/java/com/mashibing/api/service/sendCheck/impl/SignSendCheckServiceImpl.java index 1a7f87d..dd0f6e2 100644 --- a/beacon-api/src/main/java/com/mashibing/api/service/sendCheck/impl/SignSendCheckServiceImpl.java +++ b/beacon-api/src/main/java/com/mashibing/api/service/sendCheck/impl/SignSendCheckServiceImpl.java @@ -1,11 +1,20 @@ package com.mashibing.api.service.sendCheck.impl; +import com.mashibing.api.feignClient.CacheClient; import com.mashibing.api.pojo.SingleSendRequest; import com.mashibing.api.service.sendCheck.SendCheckService; +import com.mashibing.common.constant.CacheConstant; +import com.mashibing.common.constant.SMSConstant; +import com.mashibing.common.enums.ExceptionEnums; +import com.mashibing.common.exception.ApiException; import com.mashibing.common.pojo.StandardSubmit; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Map; +import java.util.Set; + /** * @author heqijun * @ClassName: SignSendCheckServiceImpl @@ -16,8 +25,43 @@ import org.springframework.stereotype.Service; @Slf4j @Service("SignSendCheck") public class SignSendCheckServiceImpl implements SendCheckService { + + @Autowired + CacheClient cacheClient; + @Override public void check(StandardSubmit standardSubmit) { - log.info("Check SignSendCheck"); + log.info("【接口模块】短信客户签名校验。。。"); + String text = standardSubmit.getText(); + //短信正确格式:【签名】短信内容。。。 + //短信内容为空,显然不可能包含签名 + if (text == null || text.isEmpty()) { + log.info("【接口模块-校验签名】短信无可用签名 text = {}", text); + throw new ApiException(ExceptionEnums.ERROR_SIGN); + } + //短信不以“【”开头或者不包含“】”,签名格式不正确 + if (!text.startsWith(SMSConstant.SIGN_PREFIX) || !text.contains(SMSConstant.SIGN_PREFIX)) { + log.info("【接口模块-校验签名】短信无可用签名 text = {}", text); + throw new ApiException(ExceptionEnums.ERROR_SIGN); + } + //截取签名 + String signInText = text.substring(1, text.indexOf(SMSConstant.SIGN_SUFFIX)); + //查询缓存中的客户签名信息 + Set clientSigns = cacheClient.smember(CacheConstant.CLIENT_SIGN + standardSubmit.getClientId()); + if (clientSigns == null || clientSigns.isEmpty()) { + log.info("【接口模块-校验签名】客户无可用签名"); + throw new ApiException(ExceptionEnums.ERROR_SIGN); + } + + //取出签名 + for (Map clientSign : clientSigns) { + String signInCache = (String) clientSign.get("signInfo"); + if (signInCache.equals(signInText)) { + log.info("【接口模块】签名校验通过!text = {}", text); + return; + } + } + log.info("【接口模块-校验签名】短信无可用签名 text = {}", text); + throw new ApiException(ExceptionEnums.ERROR_SIGN); } } diff --git a/beacon-cache/src/main/java/com/mashibing/cache/controller/CacheController.java b/beacon-cache/src/main/java/com/mashibing/cache/controller/CacheController.java index 80658ed..6e469d9 100644 --- a/beacon-cache/src/main/java/com/mashibing/cache/controller/CacheController.java +++ b/beacon-cache/src/main/java/com/mashibing/cache/controller/CacheController.java @@ -7,6 +7,7 @@ import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.*; import java.util.Map; +import java.util.Set; /** * @author heqijun @@ -69,4 +70,12 @@ public class CacheController { redisClient.sAdd(key, value); } + @PostMapping("/smember/{key}") + public Set smember(@PathVariable(value = "key") String key) { + log.info("【缓存模块】smember: key = {},", key); + Set value = redisClient.sMembers(key); + log.info("【缓存模块】sadd: key = {},\nvalue = {}", key, value); + return value; + } + } diff --git a/beacon-common/src/main/java/com/mashibing/common/constant/SMSConstant.java b/beacon-common/src/main/java/com/mashibing/common/constant/SMSConstant.java index fba6664..720d92c 100644 --- a/beacon-common/src/main/java/com/mashibing/common/constant/SMSConstant.java +++ b/beacon-common/src/main/java/com/mashibing/common/constant/SMSConstant.java @@ -3,7 +3,7 @@ package com.mashibing.common.constant; /** * @author heqijun * @ClassName: Constant - * @Description: 短信发送获取真实ip请求头信息常量 + * @Description: 短信发送入口侧校验常量 * @date 2025/6/5 17:10 */ @@ -13,4 +13,8 @@ public class SMSConstant { public static final String X_FORWARDED_FOR = "x-forwarded-for"; + public static final String SIGN_PREFIX = "【"; + + public static final String SIGN_SUFFIX = "】"; + } diff --git a/beacon-common/src/main/java/com/mashibing/common/pojo/StandardSubmit.java b/beacon-common/src/main/java/com/mashibing/common/pojo/StandardSubmit.java index 7a721d5..d7f2065 100644 --- a/beacon-common/src/main/java/com/mashibing/common/pojo/StandardSubmit.java +++ b/beacon-common/src/main/java/com/mashibing/common/pojo/StandardSubmit.java @@ -22,7 +22,7 @@ public class StandardSubmit { @Description("当前短信的唯一标识") private Long sequenceId; - @Description("客户端ID") + @Description("客户ID") private Long clientId; @Description("客户端的ip白名单")