6

私はこのようにアプリケーションで認証を設定しました。ユーザー名が指定され、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
    }

}

次に、リクエストをapplication / jsonとしてのみ使用するメソッド(この場合はtestOut)をコントローラーで定義します。ここで、認証を追加する前に「def testOut = Action(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とPlayを同時に学ぼうとしています。:-)

乾杯

ニック

4

2 に答える 2

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)
}
于 2012-04-08T11:27:19.990 に答える
1

ここでこの質問に対する私の答えを参照してください:認証されたリクエストでBodyParserを使用して2.0フレームワークを再生する

要点は、IsAuthenticatedメソッドをオーバーロードしBodyParserて、パラメーターとして受け取り、それを使用して呼び出すActionことです。

于 2012-06-20T13:45:04.953 に答える