我正在使用PlayFramework / Scala构建应用程序。
对于我的安全层,我使用 Auth0 ,这对主页面工作正常,我已经能够获取个人资料信息/添加新用户等。
现在我有一个API,我想让人们只在连接时使用它,所以我在我的API控制器上添加了自定义操作:
def AuthenticatedAction(f: Request[AnyContent] => Future[Result]): Action[AnyContent] = {
Action.async { implicit request =>
(request.session.get("idToken").flatMap { idToken =>
cache.get[JsValue](idToken + "profile")
} map { profile =>
f(request) // IF USER CONNECTED THEN ADD PROFILE TO REQUEST AND PROCEED
}).orElse {
Some(Future(Redirect("/login"))) // OTHERWISE REDIRECT TO LOGIN PAGE
}.get
}
}
我可以将它用于我的阅读操作(仅按ID返回一条记录):
def read(entityName: String, id: String) = AuthenticatedAction {
// SOME NOT RELEVANT CODE
}
当我尝试发送json来创建对象时,我的问题出现了:
在我尝试添加自定义身份验证操作之前,这是我的代码工作:
def store(entityName: String, id: String) = Action.async(parse.json) {
// SOME NOT RELEVANT CODE
}
现在我希望使用
def store(entityName: String, id: String) = AuthenticatedAction(parse.json) {
// SOME NOT RELEVANT CODE
}
这是编译错误:
type mismatch; found : play.api.mvc.BodyParser[play.api.libs.json.JsValue]
required: play.api.mvc.Request[play.api.mvc.AnyContent] ⇒ scala.concurrent.Future[play.api.mvc.Result]
我知道这是因为我不支持传递自定义正文解析器这一事实,我已经考虑过使用文档中的 ActionBuilder ,但我正在尝试使用Auth0提供的代码。
当自定义操作未定义为类时,是否有办法处理自定义解析器?
答案 0 :(得分:0)
所以我找到了解决方案!
我注意到操作异步实际上有 2 个不同的签名:
async[A](bodyParser: BodyParser[A])(block: (R[A]) ⇒ Future[Result]): Action[A]
和
async(block: ⇒ Future[Result]): Action[AnyContent]
所以我刚刚添加了另一个 AuthenticationAction
def AuthenticatedAction[A](b: BodyParser[A])(f: Request[A] => Future[Result]): Action[A] = {
Action.async(b) { implicit request =>
(request.session.get("idToken").flatMap { idToken =>
cache.get[JsValue](idToken + "profile")
} map { profile =>
f(request) // IF USER CONNECTED THEN ADD PROFILE TO REQUEST AND PROCEED
}).orElse {
Some(Future(Redirect("/login")))
}.get
}
}