0

所以这感觉像是一个面试问题,但事实并非如此。在将其标记为重复之前,请知道我已经查看了其他答案: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"
}

在这个例子中,我需要用 5 个星号来掩盖 Foo、Bar 和 Secret1,这样当我在日志中打印时,它将打印:

{
    "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": "*****"
}

我没有找到不敏感的大小写匹配示例。用易于阅读的代码解决这个问题的好方法是什么。

4

1 回答 1

1

所以我使用 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 *****"
    }
}

这并不完美,因为我想屏蔽每个新字段,我必须在这里添加一个新行,但它现在对我来说已经足够好了。

于 2019-04-12T20:41:16.857 回答