的我已經成立了認證在我的應用程序是這樣,當一個用戶名供應和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。 :-)
乾杯
聶
PS,如果在這裏有其他事情我明顯做錯了,請隨時指出,所以我可以去正確的方向,而不是:-) – niklassaers 2012-04-07 12:48:04
您可以使用'map(key)=如果(map.contains(key)map(key)= value)'代替'map。+(key - > value)'和'map.getOrElseUpdate(key,value)',而不是' – senia 2012-04-07 12:55:55
您可以使用'case _ =>'而不是'case _ => {}'。你不需要花括號:'case JsObject(fields)=> {props = fields.toMap}'。 – senia 2012-04-07 13:20:59