Spring Boot-шифрование данных JSON
в нашем приложении мы должны зашифровать / расшифровать значения свойств Json (а не имя свойства) для каждого запроса и ответа.
Пример,{"userName":"encrypted value", "email":"encrypted value"}
мы используем Sprint boot 1.3, и мы используем @RequestBody и @ResponseBody аннотации для привязки запроса json к объекту и сериализации объекта ответа как JSON.
мы не хотите вызвать метод шифрования / дешифрования в нашем методе каждого контроллера. Быть там в любом случае мы можем поручить sprint расшифровать значения json перед привязкой к объекту запроса? Аналогично, зашифровать значения поля объекта ответа перед преобразованием их в json? Или настройка Джексона может нам помочь?
спасибо!
1 ответов
вы можете написать свой собственный конвертер http-сообщений. Поскольку вы используете spring boot, это будет довольно просто: просто расширьте свой пользовательский конвертер из AbstractHttpMessageConverter
и отметить класс @Component
Примечание.
вы можете добавить дополнительные преобразователи, просто добавив бобы этого типа в контексте Spring Boot. Если добавляемый вами компонент имеет тип, который все равно был бы включен по умолчанию (например MappingJackson2HttpMessageConverter для преобразований JSON), то он заменит значение по умолчанию.
и вот простой пример:
@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;
}
}