视频046~(ip&sign校验)

master
Administrator 3 years ago
parent dd8da23c0f
commit de62a46366

@ -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<Map> smember(@PathVariable(value = "key")String key);
}

@ -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);
}
}

@ -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);
}
}

@ -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<Map> 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);
}
}

@ -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);
}
}

@ -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<Object> values = redisClient.sGet(key);
log.info("【缓存模块】 smember方法获取key ={} 的数据 value = {}", key,values);
return values;
}
}

@ -0,0 +1,18 @@
package com.mashibing.common.constant;
/**
* @author zjw
* @description
*/
public interface ApiConstant {
/**
*
*/
String SIGN_PREFIX = "【";
/**
*
*/
String SIGN_SUFFIX = "】";
}
Loading…
Cancel
Save