2012-04-07 12 views
6

Ho impostato l'autenticazione nella mia domanda come questa, consentono sempre quando un nome utente viene fornita e la chiave API è 123:parse.json di richiesta autenticata gioco

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 
    } 

} 

Voglio poi di definire un metodo nel mio controller (testout in questo caso) che utilizza la richiesta solo come application/json. Ora, prima di aggiungere l'autenticazione, direi "def testOut = Action (parse.json) {...}", ma ora che sto usando l'autenticazione, come posso aggiungere parse.json al mix e fare questo lavoro?

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

Come domanda bonus, perché solo UUID è stato aggiunto alla mappa puntelli, non entità e nome utente?

Mi dispiace per il fattore noob, sto cercando di imparare Scala e Play allo stesso tempo. :-)

Acclamazioni

Nik

+0

PS, se ci sono altre cose qui che ovviamente sto sbagliando, sentitevi liberi di indicarle, quindi posso andare nella giusta direzione invece :-) – niklassaers

+0

Potete usare 'map (key) = value' invece di 'map. + (chiave -> valore)' e 'map.getOrElseUpdate (chiave, valore)' invece di 'if (! map.contains (chiave) map (chiave) = valore)'. – senia

+0

Puoi usare 'case _ =>' invece di 'case _ => {}'. E non hai bisogno di parentesi graffe qui: 'case JsObject (fields) => {props = fields.toMap}'. – senia

risposta

1

Si scopre che non ho bisogno di usare un bodyparser a tutti, request.body ha una funzione asJson che posso usare. Quindi ho sfruttato questo per fare quanto segue. Questo lavoro, e posso continuare il mio lavoro, ma ancora non capisco come ottenere qui un parser del corpo JSON. Apprendimento in corso ... ;-)

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

Ancora, si prega di lasciare commenti su tutto ciò che dovrebbe essere fatto in modo diverso :-) – niklassaers

+0

Alcuni miglioramenti nell'uso di 'Option':' var props = request.body.asJson.collect {case JsObject (fields) => fields.toMap}. getOrElse (Map()) ' – senia

Problemi correlati