1.定义常量:
# 鉴权开关
signature.enable=false
signature.secretkey=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx
2.引用常量:
private
@Autowired
AccessConfigProperties accessConfigProperties;
@Value("${signature.enable}")
private boolean signatureEnable;
3.签名验证:
if (signatureEnable) {
String appid = request.getHeader("appid");
String signature = request.getHeader("signature");
String timestamp = request.getHeader("timestamp");
String secretKey = accessConfigProperties.getSecretKey(appid);
if (secretKey == null) { // 接入产品非法
throw new SignatureException(ErrorCode.ERR_SIGNATURE_FAIL);
}
if (StringUtils.isEmpty(signature) || StringUtils.isEmpty(timestamp) || StringUtils.isEmpty(appid)) {
throw new SignatureException(ErrorCode.ERR_SIGNATURE_FAIL, "参数缺失");
}
String key = timestamp + uid + appid + secretKey;
String result = DigestUtils.md5DigestAsHex(key.getBytes());
if (result.equals(signature)) {
filterChain.doFilter(request, response);
return;
} else {
throw new SignatureException(ErrorCode.ERR_SIGNATURE_FAIL);
}
}
附:
DigestUtils工具类
DigestUtils是一个算法工具类,在package org.apache.commons.codec.digest;这个包下。
该类中常用的方法有:
- /**
- * Calculates the MD5 digest and returns the value as a 16 element <code>byte[]</code>.
- *
- * @param data
- * Data to digest
- * @return MD5 digest
- */
- public static byte[] md5(byte[] data) {
- return getMd5Digest().digest(data);
- }
- /**
- * Calculates the MD5 digest and returns the value as a 16 element <code>byte[]</code>.
- *
- * @param data
- * Data to digest
- * @return MD5 digest
- * @throws IOException
- * On error reading from the stream
- * @since 1.4
- */
- public static byte[] md5(InputStream data) throws IOException {
- return digest(getMd5Digest(), data);
- }
- /**
- * Calculates the MD5 digest and returns the value as a 16 element <code>byte[]</code>.
- *
- * @param data
- * Data to digest
- * @return MD5 digest
- */
- public static byte[] md5(String data) {
- return md5(getBytesUtf8(data));
- }
- /**
- * Calculates the MD5 digest and returns the value as a 32 character hex string.
- *
- * @param data
- * Data to digest
- * @return MD5 digest as a hex string
- */
- public static String md5Hex(byte[] data) {
- return Hex.encodeHexString(md5(data));
- }
- /**
- * Calculates the MD5 digest and returns the value as a 32 character hex string.
- *
- * @param data
- * Data to digest
- * @return MD5 digest as a hex string
- * @throws IOException
- * On error reading from the stream