以往的返回值加密,都是在配置文件中添加相关配置并编写加密方法,这种方法导致每次更改加密开关时,都需要重启项目,对于有这方面需求的项目是非常不方便的,而Asuka支持在全局配置中动态开关返回值加密,免去了重启项目之苦。

使用方法

  1. 后台管理-全局配置,设置加密开关为true/false

image.png
true代表加密,而false代表不加密

  1. 编辑ApiEncryptResponseBodyAdvice.java
    • 所在位置:com.asuka.common.advice
    • 注意事项:
      • 如果修改了包名,同时需要修改@ControllerAdvicebasePackages为新的包名
      • 切记修改SECRET,该属性为加密的密钥,应保证唯一性
      • 如果需要针对不同的模块进行不同的加密处理,应创建多个Advice,每个Advice的basePackages应保持独立

源码示例

  1. @ControllerAdvice(basePackages = "com.asuka.module.api")
  2. public class ApiEncryptResponseBodyAdvice implements ResponseBodyAdvice<Object> {
  3. // 切记修改密钥
  4. private final String SECRET = "QiXX#kEg^0A7XXsP";
  5. private static final Logger log = LoggerFactory.getLogger(ApiEncryptResponseBodyAdvice.class);
  6. private final OptionService optionService;
  7. public ApiEncryptResponseBodyAdvice(OptionService optionService) {
  8. this.optionService = optionService;
  9. }
  10. @Override
  11. public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
  12. return optionService.getByKeyAsBoolean("response_body_encrypt");
  13. }
  14. @Override
  15. public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
  16. if (o != null) {
  17. String json;
  18. if (o instanceof String) {
  19. json = String.valueOf(o);
  20. } else {
  21. json = JSON.toJSONString(o);
  22. }
  23. log.info("============ api response body : {} ==========", json);
  24. String encryptBase64 = SecureUtil.aes(SECRET.getBytes()).encryptBase64(json);
  25. log.info("============ api response body when encrypted and base64: {} ==========", encryptBase64);
  26. o = encryptBase64;
  27. }
  28. return o;
  29. }
  30. }