2016-11-22 3 views
8

In unserer Anwendung müssen wir die Json-Eigenschaftswerte (nicht den Eigenschaftsnamen) für jede Anfrage und Antwort verschlüsseln/entschlüsseln. Beispiel,
{"userName":"encrypted value", "email":"encrypted value"}Spring Boot - JSON-Daten verschlüsseln

Wir verwenden Sprint-Boot 1.3 und wir verwenden @RequestBody und @ResponseBody Annotationen die Anfrage json mit dem Objekt zu binden und die Response-Objekt als JSON Serialisierung.

Wir nicht wollen verschlüsseln/entschlüsseln Methode in unserer jeweiligen Controller-Methode aufrufen. Gibt es irgendeine Möglichkeit, wie wir Sprint anweisen können, die JSON-Werte zu entschlüsseln, bevor sie mit dem Anforderungsobjekt verbunden werden? Ähnlich, um die Feldwerte des Antwortobjekts vor der Konvertierung in json zu verschlüsseln? Oder das Anpassen von Jackson könnte uns helfen?

Danke!

+0

einen benutzerdefinierten Client erstellen und es gibt es, bevor Sie den Kundendienst anrufen .. – johnnynemonic

+0

Was ist in Getter Implementierung entschlüsseln und in Setter verschlüsseln? –

+1

Wäre es nicht sinnvoller, in AbstractJackson2HttpMessageConverter einzubrechen oder zu erweitern, da hier die JSON-Antwort erstellt wird und der letzte Punkt vor dem Leeren der JSON-Antwort? – bigbadmouse

Antwort

8

Sie können Ihren eigenen HTTP-Nachrichtenkonverter schreiben. Da Sie Springboots verwenden, wäre das ganz einfach: Erweitern Sie einfach Ihren benutzerdefinierten Konverter von AbstractHttpMessageConverter und markieren Sie die Klasse mit @Component Annotation.

Von spring docs:

Sie zusätzliche Konverter durch einfaches Hinzufügen von Bohnen dieser Art in einem Frühlings-Boot-Kontext beitragen können. Wenn eine hinzugefügte Bean einem Typ angehört, der ohnehin standardmäßig enthalten wäre (wie MappingJackson2HttpMessageConverter für JSON-Konvertierungen), wird der Standardwert ersetzt.

Und hier ist ein einfaches Beispiel:

@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

Dies funktioniert, wenn der gesamte JSON verschlüsselt ist. In unserem Fall werden jedoch nur die JSON-Eigenschaftswerte verschlüsselt. – Raj

+0

Es liegt an Ihnen zu entscheiden, wie Sie Methoden zum Verschlüsseln und Entschlüsseln implementieren. Ich denke, Sie können 'JsonNode' verwenden, um alle Json-Objektwerte zu durchlaufen, um sie zu verschlüsseln/zu entschlüsseln. – eparvan

+0

Danke, es funktioniert! – Raj