6

Ich habe Authentifizierung in meiner Anwendung wie diese aufgebaut, immer erlauben, wenn ein Benutzername versorgt wird und der API-Schlüssel ist 123:parse.json von authentifizierten Spielanfrag

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 
    } 

} 

Ich mag dann definieren, Methode in meinem Controller (testOut in diesem Fall), die die Anfrage nur als Anwendung/Json verwendet. Jetzt, bevor ich die Authentifizierung hinzugefügt habe, würde ich sagen "def testOut = Aktion (parse.json) {...}", aber jetzt, wo ich Authentifizierung verwende, wie kann ich parse.json in den Mix und make hinzufügen diese Arbeit?

Als Bonusfrage, warum wird nur die UUID zur Props-Map hinzugefügt, nicht Entity und Username?

Sorry über den Noob-Faktor, ich versuche Scala zu lernen und gleichzeitig zu spielen. :-)

Prost

Nik

+0

PS, wenn es hier andere Dinge gibt, die ich offensichtlich falsch mache, kannst du sie aufzeigen, damit ich stattdessen in die richtige Richtung gehen kann :-) – niklassaers

+0

Du kannst 'map (key) = verwenden Wert 'anstelle von' map. + (Schlüssel -> Wert) 'und' map.getOrElseUpdate (Schlüssel, Wert) '' anstelle von 'if (! map.contains (Schlüssel) map (Schlüssel) = Wert)'. – senia

+0

Sie können 'case _ =>' anstelle von 'case _ => {}' verwenden. Und Sie brauchen hier keine geschweiften Klammern: 'case JsObject (fields) => {reps = fields.toMap}'. – senia

Antwort

1

Es stellt sich heraus, dass ich kein bodyparser überhaupt verwenden müssen, hat request.body eine asJson Funktion, die ich verwenden kann. Also habe ich das ausgenutzt um folgendes zu tun. Diese Arbeit, und ich kann meine Arbeit fortsetzen, aber ich verstehe immer noch nicht ganz, wie man einen JSON-Körper-Parser hier hereinbringt. in dem Lernfortschritt ... ;-)

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

Auch hier noch Kommentare zu allem, was anders gemacht werden sollte :-) – niklassaers

+0

Einige Verbesserungen in 'Option' Verwendung:' var requiss = request.body.asJson.collect {fall JsObject (fields) => fields.toMap}. getOrElse (Map()) ' – senia