• sign是用来检验访问是否有效的前置插件,它会根据请求参数中的,timestamp,module,method,rpcType 4个字段做Key,Value值的拼接,再拼接上appSecret,再进行MD5加密生成一个签名,然后对比,来检测请求是否合法。

    • 签名算法如下:

      • 首先构造一个Map
    1. private Map<String, String> buildParamsMap(final RequestDTO dto) {
    2. Map<String, String> map = Maps.newHashMapWithExpectedSize(4);
    3. map.put("timestamp", dto.getTimestamp());
    4. map.put("module", dto.getModule());
    5. map.put("method", dto.getMethod());
    6. map.put("rpcType", dto.getRpcType());
    7. return map;
    8. }
    • 对Map进行Key的排序后,获取值,再拼装,再拼接appSecret,进行Md5加密,最后转成大写。代码如下:
    1. /**
    2. * acquired sign.
    3. *
    4. * @param signKey sign key
    5. * @param params params
    6. * @return sign
    7. */
    8. private static String generateSign(final String signKey, final Map<String, String> params) {
    9. List<String> storedKeys = Arrays.stream(params.keySet()
    10. .toArray(new String[]{}))
    11. .sorted(Comparator.naturalOrder())
    12. .collect(Collectors.toList());
    13. final String sign = storedKeys.stream()
    14. .filter(key -> !Objects.equals(key, Constants.SIGN))
    15. .map(key -> String.join("", key, params.get(key)))
    16. .collect(Collectors.joining()).trim()
    17. .concat(signKey);
    18. return DigestUtils.md5DigestAsHex(sign.getBytes()).toUpperCase();
    19. }
    • 在soul的admin后台会有一个功能来专门维护appKey和appSecret,appKey的含义对应的就是请求参数中的moudule,appSecret是分配给某一个系统模块的秘钥。前端只需要根据算法得到并传递签名值,和moulde。soul也会进行同样的算法生成签名,来对比,从而检验请求的合法性。

    • 如果用户觉得麻烦,不想进行安全性的校验,可以在admin后台把Sign插件停用。