背景:
当前因为业务需求,对外需要暴露一个Health接口,用于检测当前的服务是否挂掉,然后通知相关项目负责人员,进行及时的补救,但是因为只是暴露了一个接口,没有相关的安全校验,存在安全漏洞,为了防止不能让任何人都可以成功访问该接口,就需要进行相关的
处理,这里采用的是一个比较成熟的wxpay的依赖包校验函数。
具体如下:
1. Maven依赖
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
2. 配置文件配置秘钥信息(这部分信息是可以动态添加的,也就是要看调用方进行哪些信息的发送)
# 健康监控秘钥
controller:
sign:
key: ghghjghjghjghjg
source: GGG
3. 获取配置文件
@Value("${controller.sign.key}")
private String signkey;
@Value("${controller.sign.source}")
private String source;
4. Health的服务健康监控接口
Slf4j
@RestController
/**
* @Author GCG
* @Date:2021/1/11
* @Description: 功能描述 : 服务健康监控接口:
*/
public class HealthController {
@Autowired
Application application;
// 方式2: 直接使用Health实体类进行处理
@GetMapping("/health")
public ResponseEntity healthAction(@RequestParam Map<String, String> lastMap) {
JSONObject jsonObject = new JSONObject();
String result = null;
try {
result = WXPayUtil.generateSignature(lastMap, application.getSignkey());
} catch (Exception e) {
e.printStackTrace();
}
//对比参数sign
try {
if (lastMap.get("sign").toString().equals(result)) {
if (application.getSource().equals(lastMap.get("source").toString())) {
//固定log日志的格式
log.info("当前服务正常!!!");
jsonObject.put("status", "UP");
} else {
jsonObject.put("status", "DOWN");
jsonObject.put("message", "Sign值无效");
}
} else {
jsonObject.put("status", "DOWN");
jsonObject.put("message", "Sign值无效");
}
} catch (Exception e) {
jsonObject.put("status", "DOWN");
jsonObject.put("message", "缺少相关的参数,请检查是否输入Sign值");
}
return new ResponseEntity<>(jsonObject, HttpStatus.OK);
}
}
总结:
从上面的接口可以看出,lastMap就是请求参数中所有的数据,这个需要请求方进行设置,同时在配置文件中添加的数据key,source等都是直接使用的请求方约定的秘钥。加密的算法也是使用相同的解密算法。原理上来讲就是MD5加密私钥。进行请求,我们这边进行MD5加密进行比较sign值。如果相同就是直接返回up,否则就是值无效。(采用MD5主要就是防止被反解,造成安全攻击)