与大多数有关Action组成的讨论(例如讨论)不同,我需要在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正文,对其进行解析并通过我的安全层过滤所有传入的请求?

===============>>#1 票数:1 已采纳

我认为将令牌移至您的请求标头会更好。 这样做将允许您使用Play的AuthententicatedBuilder,它是一个ActionBuilder来帮助进行身份验证。

如果可以这样做,那么您可能会具有如下特征:

trait Authentication {
  object Authenticated extends play.api.mvc.Security.AuthenticatedBuilder(checkGPToken(_), onUnauthorized(_))

  def checkGPToken(request: RequestHeader): Option[User] = {
    request.headers.get("GPToken") flatMap { token =>
      // Do the check with the token
      // Return something about the user that will be available inside your actions
    }
  }

  def onUnauthorized(request: RequestHeader) = {
    // Do something when it doesn't pass authorization
    Results.Unauthorized
  }
}

现在,使用控制器,您可以轻松地创建需要身份验证的操作。

object SomeController extends Controller with Authentication {
    def someAction = Authenticated { req =>
      // Your user your header check is available
      val user = req.user
      // Do something in the context of being authenticated
      Ok
    }
}

  ask by Zac translate from so

未解决问题?本站智能推荐:

3回复

如何在Play + Scala中为自定义对象定义JSON writer?

您能否演示如何在Scala和Play Framework 2.1-RC2中为类定义json writer? 该文档非常混乱(并且将成为Web开发人员社区广泛采用Scala / Play的重大障碍)。 例如,不仅不清楚下面的代码(从此处获取 )应位于何处 但是如果我将其放在obje
1回复

如何使用Scala和Play Framework自定义Json序列化?

我想将一些Scala案例类序列化为Json。 例如我的案例类如下: 我想将它序列化为Json,如下所示: 所以我需要为BigDecimal和Date定制血清。 从1970年1月1日起,我想要的数据是毫秒。 使用Scala和Play Framework时,我可以使用Jso
2回复

Json在Scala中为自定义类编写

我有一些字符串的Seq ,大致如下: 案例类可能是 和一个隐式的写 希望将其转换为像 如何正确建模数据并能够使用Writes将此Seq转换为Json? 甚至将states val更改为适当的格式,以便我可以轻松地将其转换为Json? 在案例类中,字段之
2回复

使用Scala和Play Framework将自定义类型的映射序列化为JSON

我使用http://www.blaenkdenum.com/notes/play/上的信息创建了自定义类型的地图: 我需要将Map[Product, List[StockItem]]序列化/反序列化为JSON,但是我真的不知道该怎么做。 我已经有两个自定义类型(产品和StockItem
2回复

如何编写Scala Play框架自定义类的多个JSON序列化器反序列化器?

我有以下课程需要序列化解串器 我有多个构造函数的用户案例类。 这样用户可以创建为 var u =新用户(mid,mname,memail,mpassword) var u =新用户(mid,mname) 我期望JSON请求为 JSON请求类型1:-
1回复

Play scala 2.x中的JSON读取组合器不适用于Map [String,_]

我有一个Play-scala v2.3应用程序。 从有关Json Combinators的指南中寻找,我正在尝试这样做: 但是然后我得到了编译错误: 这是需要读取的示例json: 我也尝试过这个: 同样的错误。 看来Play的JSON组合器不适用于Map类
2回复

从Json获取NPE的Reads验证(在Scala中读取自定义类)

我有一种情况想要读取这样的对象: GPID是Int的包装(请参见下文)。 该类可以很好地序列化(写),但是当我尝试反序列化(读)然后进行验证时,Play会抛出NPE。 编辑 上面发布的示例已简化。 我正在使用的实际代码要复杂一些,因此我试图创建一个简单的示例。 这是
3回复

在Scala中进行读取和写入以获取自定义类的列表

所以我的项目中有两个课程 和 我正在尝试为Order创建读写属性,但是我收到编译器错误说: “找不到unapply或unapplySeq函数” 在我的控制器中,我有以下内容: 该代码适用于itemReads和itemWrites但不适用于底部两个。 谁能告诉
1回复

在Scala播放中重构json

以下代码获取请求正文并验证并创建json:object ValidateDBConfigJson { } } json看起来像这样: 我想以以下格式进行结构化:
1回复

Scala播放JSON组合器以验证相等性

我正在使用play 2.2.0 Reads验证我的应用程序中的传入请求。 我正在尝试使用json API实现一个非常简单的事情。 我有一个像这样的json: 我已经有Reads可以检查其他内容,例如最小长度 我想创建一个解析器组合,将匹配两个字段的值,并返回JsSucce