【发布时间】:2015-05-17 11:32:41
【问题描述】:
与大多数关于 Action 组合的讨论(例如this one)不同,我需要在我的 Action 中解析传入的 JSON 请求。这是因为我们的应用程序提供了嵌入在 JSON 中的安全令牌(而不是像典型的那样在标头中)。
我想要实现的是:
object AuthenticatedAction extends ActionBuilder[UserRequest] with ActionTransformer[Request, UserRequest] {
// Do something magical here that will:
// 1. parse the inbound request.body.validate[GPToken]
// 2. (do stuff with the token to check authorization)
// 3. if NOT authorized return an HTTP NOTAUTHORIZED or FORBIDDEN
// 4. otherwise, forward the request to the desired endpoint
}
object SomeController extends Controller
val action = AuthenticatedAction(parse.json) { implicit request =>
request.body.validate[SomeRequest] match {
// Do whatever... totally transparent and already authorized
}
}
...
入站 JSON 将始终有一个令牌,例如:
{
"token":"af75e4ad7564cfde",
// other parameters we don't care about
}
所以,我想解析我们想要的(并且不最终解析复杂的、深度嵌套的 JSON 结构)我可以只拥有一个 GPToken 对象:
class GPToken(token: String)
object GPToken { implicit val readsToken = Json.reads[GPToken] }
然后在 AuthenticationAction 的“魔法”中,我可以只反序列化令牌,对数据库执行我的操作以检查授权,然后传递请求或发回 NOTAUTHORIZED。但这就是我迷路的地方......我如何获取 json 正文,解析它,并通过我的安全层过滤所有传入的请求?
【问题讨论】:
-
注意一个骗局,但非常非常接近。在这种情况下,我们需要解释入站 JSON(而不是请求标头),而我在这样做时遇到了麻烦。引用的文章讨论了使用标头。
标签: json scala playframework