diff --git a/beacon-api/src/main/java/com/mashibing/api/client/BeaconCacheClient.java b/beacon-api/src/main/java/com/mashibing/api/client/BeaconCacheClient.java index 8aac4a4..1d97dce 100644 --- a/beacon-api/src/main/java/com/mashibing/api/client/BeaconCacheClient.java +++ b/beacon-api/src/main/java/com/mashibing/api/client/BeaconCacheClient.java @@ -5,6 +5,7 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import java.util.Map; +import java.util.Set; /** * @author zjw @@ -16,4 +17,12 @@ public interface BeaconCacheClient { @GetMapping("/cache/hgetall/{key}") Map hGetAll(@PathVariable(value = "key")String key); + @GetMapping("/cache/hget/{key}/{field}") + Object hget(@PathVariable(value = "key")String key,@PathVariable(value = "field")String field); + + @GetMapping("/cache/hget/{key}/{field}") + String hgetString(@PathVariable(value = "key")String key,@PathVariable(value = "field")String field); + + @GetMapping("/cache/smember/{key}") + Set smember(@PathVariable(value = "key")String key); } diff --git a/beacon-api/src/main/java/com/mashibing/api/filter/impl/ApiKeyCheckFilter.java b/beacon-api/src/main/java/com/mashibing/api/filter/impl/ApiKeyCheckFilter.java index 2b68728..25779cd 100644 --- a/beacon-api/src/main/java/com/mashibing/api/filter/impl/ApiKeyCheckFilter.java +++ b/beacon-api/src/main/java/com/mashibing/api/filter/impl/ApiKeyCheckFilter.java @@ -37,8 +37,7 @@ public class ApiKeyCheckFilter implements CheckFilter { } //3. 正常封装数据 - submit.setClientId(Long.parseLong(clientBusiness.get("clientId") + "")); - submit.setIp(clientBusiness.get("ipAddress") + ""); + submit.setClientId(Long.parseLong(clientBusiness.get("id") + "")); log.info("【接口模块-校验apikey】 查询到客户信息 clientBusiness = {}",clientBusiness); } } diff --git a/beacon-api/src/main/java/com/mashibing/api/filter/impl/IPCheckFilter.java b/beacon-api/src/main/java/com/mashibing/api/filter/impl/IPCheckFilter.java index 787d665..746c392 100644 --- a/beacon-api/src/main/java/com/mashibing/api/filter/impl/IPCheckFilter.java +++ b/beacon-api/src/main/java/com/mashibing/api/filter/impl/IPCheckFilter.java @@ -1,8 +1,14 @@ package com.mashibing.api.filter.impl; +import com.mashibing.api.client.BeaconCacheClient; import com.mashibing.api.filter.CheckFilter; +import com.mashibing.common.constant.CacheConstant; +import com.mashibing.common.enums.ExceptionEnums; +import com.mashibing.common.exception.ApiException; import com.mashibing.common.model.StandardSubmit; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** @@ -13,9 +19,27 @@ import org.springframework.stereotype.Service; @Slf4j public class IPCheckFilter implements CheckFilter { + @Autowired + private BeaconCacheClient cacheClient; + + private final String IP_ADDRESS = "ipAddress"; + @Override public void check(StandardSubmit submit) { log.info("【接口模块-校验ip】 校验ing…………"); + //1. 根据CacheClient根据客户的apikey以及ipAddress去查询客户的IP白名单 + String ip = cacheClient.hgetString(CacheConstant.CLIENT_BUSINESS + submit.getApikey(), IP_ADDRESS); + submit.setIp(ip); + + //2. 如果IP白名单为null,直接放行 + if(StringUtils.isEmpty(ip) || ip.contains(submit.getRealIP())){ + log.info("【接口模块-校验ip】 客户端请求IP合法!"); + return; + } + + //3. IP白名单不为空,并且客户端请求不在IP报名单内 + log.info("【接口模块-校验ip】 请求的ip不在白名单内"); + throw new ApiException(ExceptionEnums.IP_NOT_WHITE); } } diff --git a/beacon-api/src/main/java/com/mashibing/api/filter/impl/SignCheckFilter.java b/beacon-api/src/main/java/com/mashibing/api/filter/impl/SignCheckFilter.java index 3271c50..a796a35 100644 --- a/beacon-api/src/main/java/com/mashibing/api/filter/impl/SignCheckFilter.java +++ b/beacon-api/src/main/java/com/mashibing/api/filter/impl/SignCheckFilter.java @@ -1,10 +1,20 @@ package com.mashibing.api.filter.impl; +import com.mashibing.api.client.BeaconCacheClient; import com.mashibing.api.filter.CheckFilter; +import com.mashibing.common.constant.ApiConstant; +import com.mashibing.common.constant.CacheConstant; +import com.mashibing.common.enums.ExceptionEnums; +import com.mashibing.common.exception.ApiException; import com.mashibing.common.model.StandardSubmit; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Map; +import java.util.Set; + /** * @author zjw * @description 校验短信的签名 @@ -13,9 +23,53 @@ import org.springframework.stereotype.Service; @Slf4j public class SignCheckFilter implements CheckFilter { + @Autowired + private BeaconCacheClient cacheClient; + + /** + * 截取签名的开始索引 + */ + private final int SIGN_START_INDEX = 1; + + /** + * 客户存储签名信息的字段 + */ + private final String CLIENT_SIGN_INFO = "signInfo"; + + @Override public void check(StandardSubmit submit) { log.info("【接口模块-校验签名】 校验ing…………"); + //1. 判断短信内容是否携带了【】 + String text = submit.getText(); + if(!text.startsWith(ApiConstant.SIGN_PREFIX) || !text.contains(ApiConstant.SIGN_SUFFIX)){ + log.info("【接口模块-校验签名】 无可用签名 text = {}",text); + throw new ApiException(ExceptionEnums.ERROR_SIGN); + } + //2. 将短信内容中的签名截取出来 + String sign = text.substring(SIGN_START_INDEX, text.indexOf(ApiConstant.SIGN_SUFFIX)); + if(StringUtils.isEmpty(sign)){ + log.info("【接口模块-校验签名】 无可用签名 text = {}",text); + throw new ApiException(ExceptionEnums.ERROR_SIGN); + } + + //3. 从缓存中查询出客户绑定的签名 + Set set = cacheClient.smember(CacheConstant.CLIENT_SIGN + submit.getClientId()); + if(set == null || set.size() == 0){ + log.info("【接口模块-校验签名】 无可用签名 text = {}",text); + throw new ApiException(ExceptionEnums.ERROR_SIGN); + } + //4. 判断~ + for (Map map : set) { + if(sign.equals(map.get(CLIENT_SIGN_INFO))){ + log.info("【接口模块-校验签名】 找到匹配的签名 sign = {}",sign); + return; + } + } + + //5. 到这,说明没有匹配的签名 + log.info("【接口模块-校验签名】 无可用签名 text = {}",text); + throw new ApiException(ExceptionEnums.ERROR_SIGN); } } diff --git a/beacon-api/src/test/java/com/mashibing/api/filter/CheckFilterContextTest.java b/beacon-api/src/test/java/com/mashibing/api/filter/CheckFilterContextTest.java index b38356d..0026913 100644 --- a/beacon-api/src/test/java/com/mashibing/api/filter/CheckFilterContextTest.java +++ b/beacon-api/src/test/java/com/mashibing/api/filter/CheckFilterContextTest.java @@ -7,16 +7,13 @@ import org.springframework.test.context.junit4.SpringRunner; import static org.junit.Assert.*; -@SpringBootTest -@RunWith(SpringRunner.class) public class CheckFilterContextTest { - @Autowired - private CheckFilterContext checkFilterContext; @org.junit.Test public void check() { - Object obj = new Object(); - checkFilterContext.check(null); + String xxx = "【】"; + String sign = xxx.substring(1,xxx.indexOf("】")); + System.out.println(sign); } } \ No newline at end of file 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 599a622..b563c88 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 @@ -46,4 +46,23 @@ public class CacheController { return value; } + @GetMapping("/cache/hget/{key}/{field}") + public Object hget(@PathVariable(value = "key")String key,@PathVariable(value = "field")String field){ + log.info("【缓存模块】 hget方法,获取key ={},field = {}的数据", key,field); + Object value = redisClient.getMapItem(key, field); + log.info("【缓存模块】 hget方法,获取key ={},field = {} 的数据 value = {}", key,field,value); + return value; + } + + @GetMapping("/cache/smember/{key}") + public Set smember(@PathVariable(value = "key")String key){ + log.info("【缓存模块】 smember方法,获取key ={}的数据", key); + Set values = redisClient.sGet(key); + log.info("【缓存模块】 smember方法,获取key ={} 的数据 value = {}", key,values); + return values; + } + + + + } diff --git a/beacon-common/src/main/java/com/mashibing/common/constant/ApiConstant.java b/beacon-common/src/main/java/com/mashibing/common/constant/ApiConstant.java new file mode 100644 index 0000000..9e21145 --- /dev/null +++ b/beacon-common/src/main/java/com/mashibing/common/constant/ApiConstant.java @@ -0,0 +1,18 @@ +package com.mashibing.common.constant; + +/** + * @author zjw + * @description + */ +public interface ApiConstant { + + /** + * 签名的前缀 + */ + String SIGN_PREFIX = "【"; + /** + * 签名的后缀 + */ + String SIGN_SUFFIX = "】"; + +}