2012-04-07 24 views
6

tôi đã thiết lập xác thực trong ứng dụng của tôi như thế này, luôn luôn cho phép khi một tên người dùng được cung cấp và API-key là 123:parse.json đề nghị chơi chứng thực

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 
    } 

} 

Tôi muốn sau đó để xác định một phương pháp trong bộ điều khiển của tôi (testOut trong trường hợp này) mà sử dụng các yêu cầu như ứng dụng/json chỉ. Bây giờ, trước khi tôi thêm xác thực, tôi muốn nói "def testOut = Action (parse.json) {...}", nhưng bây giờ tôi đang sử dụng xác thực, làm cách nào tôi có thể thêm parse.json vào danh sách kết hợp và tạo công việc này?

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

Là câu hỏi bổ sung, tại sao chỉ UUID được thêm vào bản đồ đạo cụ, không phải thực thể và tên người dùng?

Xin lỗi về yếu tố noob, tôi đang cố gắng học Scala và Play cùng một lúc. :-)

Cheers

Nik

+0

PS, nếu có những thứ khác ở đây mà tôi rõ ràng đang làm sai, cảm thấy tự do để chỉ ra chúng, vì vậy tôi có thể đi đúng hướng thay vì :-) – niklassaers

+0

Bạn có thể sử dụng 'map (key) = value' thay vì 'map. + (key -> value)' và 'map.getOrElseUpdate (khóa, giá trị)' thay vì 'if (! map.contains (key) map (key) = value)'. – senia

+0

Bạn có thể sử dụng 'case _ =>' thay vì 'case _ => {}'. Và bạn không cần dấu ngoặc nhọn ở đây: 'case JsObject (fields) => {props = fields.toMap}'. – senia

Trả lời

1

Nó chỉ ra rằng tôi không cần phải sử dụng một bodyparser ở tất cả, request.body có chức năng asJson mà tôi có thể sử dụng. Vì vậy, tôi khai thác này để làm như sau. Công việc này, và tôi có thể tiếp tục công việc của mình, nhưng tôi vẫn không hiểu làm thế nào để có được một trình phân tích cú pháp cơ thể JSON ở đây. Học cơ bản dở dang ... ;-)

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

Một lần nữa, xin vui lòng để lại ý kiến ​​về bất cứ điều gì cần được thực hiện khác nhau :-) – niklassaers

+0

Một số cải tiến trong cách sử dụng 'Tùy chọn':' var props = request.body.asJson.collect {case JsObject (fields) => fields.toMap}. getOrElse (Bản đồ()) ' – senia

Các vấn đề liên quan