【问题标题】:How to use json body parser in Security trait如何在安全特征中使用 json 正文解析器
【发布时间】:2013-10-18 10:37:30
【问题描述】:

我是新手和 scala,所以很难弄清楚一些基本的东西。我正在尝试实现的是 api 身份验证。为了实现它,我在 zentask 示例中实现了类似于 Security trait 的类似身份验证操作。

但是当我试图在安全特征中访问请求的 json 主体时,我得到编译器错误说; "值 \ 不是类型参数 A 的成员"

这里是授权操作;

def withApiAuth[A](bp: BodyParser[A])(f: Request[A] => Result): Action[A] = {
        Action(bp) { request =>
            val chargeJson = request.body
            val appId:Option[String] = (chargeJson \ "appid").asOpt[String]

            if(appId.isDefined){
                Logger.info("Api request" + appId)
                f(request)
            }
            else{
                Results.BadRequest("unfortunately")
            }
        }
    }

我在这样的控制器中使用它;

def pay = withApiAuth(parse.json){ request =>

        val chargeJson = request.body

        println(chargeJson)

        Ok("helo")
    }

我错过了什么?

【问题讨论】:

  • 我不太确定你想用withApiAuth 完成什么。您收到该编译错误是因为编译器不知道主体解析器是withApiAuth 中的json。如果您的意图是在每个请求中传递 json,那么 body 解析器不应该是一个参数,但这将严重限制该函数的使用。
  • 其实我想要完成的是,所有用withApiAuth组成的动作都应该是json内容的http请求。并且还应该在正文中包含一个应用程序 ID。这样我就不需要在每个动作中一次又一次地实施这些。我想要一个可重用的动作块,它只接受 json 请求并提供一个简单的身份验证机制。
  • 您可以将bp: BodyParser[A] 替换为 parse.json,因为您只希望正文解析器为 json。这当然会阻止您使用 POST 表单或任何其他请求正文。而且它不是一种远程安全的身份验证形式。
  • 感谢实际工作的人。将其发布为 anwser,以便我可以标记它。

标签: json scala playframework-2.2


【解决方案1】:

您可以将bp: BodyParser[A] 替换为parse.json。由于您只希望请求的主体是 json,因此它应该是固定的主体解析器。否则 json api 将无法确定 request.body 应该是 json。

【讨论】:

    【解决方案2】:

    request.body 还不够。您需要做 request.body.asJson 以便chargeJson 是正确的类型。

    val chargeJson = request.body val appId:Option[String] = (chargeJson \"appid").asOpt[String]

    【讨论】:

    • request.body 使用正文解析器就足够了。
    猜你喜欢
    • 2018-05-29
    • 2015-01-15
    • 1970-01-01
    • 2019-05-30
    • 2017-10-21
    • 2014-08-27
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    相关资源
    最近更新 更多