认证的播放请求的parse.json(parse.json of authenticated pla

2019-09-16 09:31发布

我已经成立了认证在我的应用程序是这样,当一个用户名供应和API密钥为123,总能让:

object Auth  {
    def IsAuthenticated(block: => String => Request[AnyContent] => Result) = {
      Security.Authenticated(RetrieveUser, HandleUnauthorized) { user =>
        Action { request =>
          block(user)(request)
        }
      }
    }

    def RetrieveUser(request: RequestHeader) = {

      val auth = new String(base64Decode(request.headers.get("AUTHORIZATION").get.replaceFirst("Basic", "")))
      val split  = auth.split(":")
      val user = split(0)
      val pass = split(1)
      Option(user)
    }

    def HandleUnauthorized(request: RequestHeader) = {
      Results.Forbidden
    }

    def APIKey(apiKey: String)(f: => String => Request[AnyContent] => Result) = IsAuthenticated { user => request =>

      if(apiKey == "123")
        f(user)(request)
      else
        Results.Forbidden
    }

}

我想然后,以限定在我的控制器(TESTOUT在这种情况下),使用该请求,因为只有应用程序/ JSON的方法。 现在,在我加入的认证,我会说“高清TESTOUT =动作(parse.json){...}”,但现在,我使用的身份验证,我怎样才能到混合添加parse.json,使这项工作?

  def testOut = Auth.APIKey("123") { username => implicit request =>

    var props:Map[String, JsValue] = Map[String, JsValue]()
    request.body  match {
      case JsObject(fields) => { props = fields.toMap }
      case _ => {} // Ok("received something else: " + request.body + '\n')
    }

    if(!props.contains("UUID"))
      props.+("UUID" -> UniqueIdGenerator.uuid)

    if (!props.contains("entity"))
      props.+("entity" -> "unset")

    props.+("username" -> username)

    Ok(props.toString)
  }

作为奖励问题,为什么只UUID添加到地图的道具,而不是实体和用户名?

很抱歉的小白因素,我想学习Scala和在同一时间播放。 :-)

干杯

Answer 1:

事实证明,我并不需要在所有使用bodyparser,request.body有,我可以用一个asJson功能。 所以,我利用这个做到以下几点。 这项工作,我可以继续我的工作,但我还是不太明白如何在这里得到一个JSON解析器体。 学习中... ;-)

def testOut = Auth.APIKey("123") { username => request =>

  var props:Map[String, JsValue] = Map[String, JsValue]()
  request.body.asJson  match {
    case None => {}
    case Some(x) => {
      x match {
        case JsObject(fields) => { props = fields.toMap }
        case _ => {} // Ok("received something else: " + request.body + '\n')
      }
    }
  }

  if(!props.contains("UUID"))
    props += "UUID" -> toJson(UniqueIdGenerator.uuid)

  if(!props.contains("entity"))
    props += "entity" -> toJson("unset")

  props += "should" -> toJson("appear")
  props += "username" -> toJson(username)

  Ok(props.toString)
}


Answer 2:

见我回答这个问题在这里: 播放2.0框架,使用BodyParser与验证的请求

要点是,我重载IsAuthenticated方法采取BodyParser作为参数,并呼吁Action吧。



文章来源: parse.json of authenticated play request