Как замаскировать конфиденциальные данные в теле XML с помощью zalando.logbook

#java #spring

#java #весна

Вопрос:

Zalando.В журнале есть несколько фильтров маски по умолчанию, но я не нашел ни одного для XML-тел. Мне нужно замаскировать поле пароля ( <password>1234<password> -> <password>masked<password> ) в теле xml. Реализовал ли какой-либо орган фильтр тела, который может маскировать пароль в теле xml?

   @Bean
  public Logbook getLogBook() {
    final Set<String> properties = new HashSet<>(Arrays.asList("password");

    return Logbook.builder()
        .bodyFilter(BodyFilters.replaceFormUrlEncodedProperty(properties, "<masked>"))
                                                 .build();
  }
 

Ответ №1:

В источниках журнала журнала есть класс для сжатия XML-файлов : org.zalando.logbook.CompactingXmlBodyFilter .

Просто скопируйте и вставьте его и создайте свою собственную реализацию преобразования XML, как в removeEmptyTextNodes() .

Например:

 class LogbookXmlBodyPasswordFilter implements BodyFilter {
    [...]
    private void removePasswordTag(final Document document) throws Exception {
            final XPathFactory xPathFactory = XPathFactory.newInstance();
            final XPath xpath = xPathFactory.newXPath();
            NodeList nodeList = (NodeList) xpath.evaluate("Password", document, XPathConstants.NODESET);
    
            for (int i = 0; i < nodeList.getLength(); i  ) {
                final Node node = nodeList.item(i);
                node.getParentNode().removeChild(node);
            }
        }
}
 

Этот метод удалит любой <Password> тег из XML.

Затем вы можете использовать его следующим образом:

  @Bean
 public BodyFilter bodyFilter() {
     return logbookXmlBodyPasswordFilter();
 }

 public static BodyFilter logbookXmlBodyPasswordFilter() {
     return new LogbookXmlBodyPasswordFilter();
 }