Как замаскировать чувствительные поля, такие как пароли, в тесте JSON в Scala? - PullRequest
0 голосов
/ 10 апреля 2019

Так что это похоже на вопрос интервью, но это не так.Прежде чем пометить это как дубликат, пожалуйста, знайте, что я посмотрел на другие ответы: 1. нет решения scala, 2. моему делу нужен способ маскировки более чем одного подходящего ключа.

У меня есть def, который выполняет все мои http-запросы.После отправки запроса я регистрирую запрос и ответ.Так как эти запросы имеют тело JSON, которое может иметь или не иметь чувствительное поле, подобное следующему:

challengeAnswer
currPassword
password
answer
oldPassword

Я хотел бы создать универсальный сканер JSON, который DEEP сканирует ключи данного объекта JSON и маскируетзначение, если оно совпадает с одним из этих регулярных выражений без учета регистра:

.*answer.*
.*password.*

Тело образца запроса:

{
    "resetPassQuestion1": "I pity the ...?",
    "resetPassAnswer1": "Foo",
    "resetPassQuestion2": "Let's grab a pint at the ...?",
    "resetPassAnswer2": "Bar",
    "firstname": "John",
    "lastname": "Doe",
    "email": "john.doe@example.com",
    "loginId": "jdoe666",
    "password": "Secret1"
}

Мне нужно замаскировать Foo, Bar и Secret1 в этом примере с 5 звездочкаминапример, когда я печатаю в журналах, он будет печатать:

{
    "resetPassQuestion1": "I pity the ...?",
    "resetPassAnswer1": "*****",
    "resetPassQuestion2": "Let's grab a pint at the ...?",
    "resetPassAnswer2": "*****",
    "firstname": "John",
    "lastname": "Doe",
    "email": "john.doe@example.com",
    "loginId": "jdoe666",
    "password": "*****"
}

Я не нахожу примеров соответствия регистров, которые нечувствительны.Что является хорошим четким способом решения этой проблемы с помощью легко читаемого кода.

1 Ответ

1 голос
/ 12 апреля 2019

Итак, я решил это с помощью преобразования LiftJson.

import net.liftweb.json.JsonParser
import net.liftweb.json.Printer.compact
import net.liftweb.json.JsonAST._

private def maskPasswords(jsonStr: String): String = {
    Try(JsonParser.parse(jsonStr)) match {
        case Success(json) => {
            compact(
                render(
                    json.transform {
                        case JField("password",_) => JString("*****")
                        case JField("oldPassword",_) => JString("*****")
                        case JField("resetPassAnswer2",_) => JString("*****")
                        case JField("resetPassAnswer1",_) => JString("*****")
                    }
                )
            )
        }
        case _ => "**** JsonParsing Failed! **** Masking Everything *****"
    }
}

Это не идеально, так как каждое новое поле, которое я хочу замаскировать, мне нужно было бы добавить новую строку здесь, но пока это работает достаточно хорошо для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...