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