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
PS, se ci sono altre cose qui che ovviamente sto sbagliando, sentitevi liberi di indicarle, quindi posso andare nella giusta direzione invece :-) – niklassaers
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
Puoi usare 'case _ =>' invece di 'case _ => {}'. E non hai bisogno di parentesi graffe qui: 'case JsObject (fields) => {props = fields.toMap}'. – senia