【发布时间】:2012-04-07 12:46:54
【问题描述】:
我在我的应用程序中设置了这样的身份验证,当提供用户名且 API 密钥为 123 时始终允许:
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
}
}
然后我想在我的控制器(在本例中为 testOut)中定义一个方法,该方法仅将请求用作 application/json。现在,在我添加身份验证之前,我会说“def testOut = Action(parse.json) {...}”,但是现在我正在使用身份验证,如何将 parse.json 添加到混合中并制作这份工作?
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)
}
作为一个额外的问题,为什么只有 UUID 添加到道具映射中,而不是实体和用户名?
抱歉,我正在尝试同时学习 Scala 和 Play。 :-)
干杯
尼克
【问题讨论】:
-
PS,如果这里还有其他我明显做错的事情,请随时指出,这样我可以朝着正确的方向前进:-)
-
您可以使用
map(key) = value代替map.+(key -> value)和map.getOrElseUpdate(key, value)代替if (!map.contains(key) map(key) = value)。 -
您可以使用
case _ =>代替case _ => {}。而且这里不需要花括号:case JsObject(fields) => { props = fields.toMap }。 -
您正在使用不可变映射(因为
toMap返回不可变映射),因此您无法更新它。并且Map的方法+创建了一个新地图,而不更新当前地图。您可以使用map += key -> value将地图替换为新版本。 -
非常感谢@senia 的地图输入。 :-) 关于在哪里添加 parse.json 以获得 Request[JsValue] 而不是 Request[AnyContent] 的任何建议?
标签: json scala authentication playframework playframework-2.0