2012-04-07 40 views
6

的我已經成立了認證在我的應用程序是這樣,當一個用戶名供應和API密鑰爲123,總能讓:parse.json認證的播放請求

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),只使用請求作爲application/json。現在,在我添加身份驗證之前,我會說「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添加到道具地圖,而不是實體和用戶名?

對不起noob因素,我正在嘗試同時學習Scala和Play。 :-)

乾杯

+0

PS,如果在這裏有其他事情我明顯做錯了,請隨時指出,所以我可以去正確的方向,而不是:-) – niklassaers 2012-04-07 12:48:04

+0

您可以使用'map(key)=如果(map.contains(key)map(key)= value)'代替'map。+(key - > value)'和'map.getOrElseUpdate(key,value)',而不是' – senia 2012-04-07 12:55:55

+0

您可以使用'case _ =>'而不是'case _ => {}'。你不需要花括號:'case JsObject(fields)=> {props = fields.toMap}'。 – senia 2012-04-07 13:20:59

回答

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) 
} 
+0

同樣,請留下關於任何應該以不同方式完成的註釋:-) – niklassaers 2012-04-08 11:28:01

+0

Option選項的一些改進:var props = request.body.asJson.collect {case JsObject(fields)=> fields.toMap}。 getOrElse(圖())' – senia 2012-04-08 15:23:56