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;
    }
}