2016-11-22 50 views
8

在我们的应用程序中,我们必须为每个请求和响应加密/解密Json属性值(而不是属性名称)。 实施例,
{"userName":"encrypted value", "email":"encrypted value"}Spring Boot - 加密JSON数据

我们使用Sprint的引导1.3和我们使用@RequestBody@ResponseBody注释结合与对象的请求JSON和序列化响应对象作为JSON。

我们不要想在我们的每个控制器方法中调用加密/解密方法。有什么方法可以指示Sprint在绑定请求对象之前解密json值?同样,要将响应对象字段值在转换为json之前加密?或者定制杰克逊可能会帮助我们?

谢谢!

+0

建立一个自定义客户端,做它那里调用有关实现解密getter和setter方法中加密哪些服务.. – johnnynemonic

+0

过吗? –

+1

不会进入或扩展AbstractJackson2HttpMessageConverter更具体,因为这是建立json响应的地方,以及刷新之前的最后一点? – bigbadmouse

回答

8

你可以编写自己的http消息转换器。由于您使用的是弹簧启动,因此很容易:只需从AbstractHttpMessageConverter扩展您的自定义转换器并用@Component注释标记该类。

spring docs

您可以通过简单地在Spring引导上下文添加该类型的豆贡献额外的转换器。如果您添加的bean是默认包含的类型(例如用于JSON转换的MappingJackson2HttpMessageConverter),那么它将替换默认值。

这里是一个简单的例子:

@Component 
public class Converter extends AbstractHttpMessageConverter<Object> { 

    public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); 

    @Inject 
    private ObjectMapper objectMapper; 

    public Converter(){ 
     super(MediaType.APPLICATION_JSON_UTF8, 
      new MediaType("application", "*+json", DEFAULT_CHARSET)); 
    } 

    @Override 
    protected boolean supports(Class<?> clazz) { 
     return true; 
    } 

    @Override 
    protected Object readInternal(Class<? extends Object> clazz, 
            HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { 
     return objectMapper.readValue(decrypt(inputMessage.getBody()), clazz); 
    } 

    @Override 
    protected void writeInternal(Object o, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { 
     outputMessage.getBody().write(encrypt(objectMapper.writeValueAsBytes(o))); 
    } 

    private InputStream decrypt(InputStream inputStream){ 
     // do your decryption here 
     return inputStream; 
    } 

    private byte[] encrypt(byte[] bytesToEncrypt){ 
     // do your encryption here 
     return bytesToEncrypt; 
    } 
} 
+0

这将工作,如果整个JSON加密。但在我们的例子中,只有json属性值会被加密。 – Raj

+0

由你决定如何实现'encrypt'和'decrypt'方法。我想你可以使用'JsonNode'遍历所有的json对象值来加密/解密它们。 – eparvan

+0

感谢它的工作! – Raj