播放自定义过滤器JSON错误

时间:2016-08-18 12:45:22

标签: scala playframework silhouette

我正在使用Play Framework进行身份验证(JWT)的Silhouette 中创建REST API。

我需要为每个安全响应添加一些标头(仅在用户被记录时)。所以我想用filter添加它们。但我得到了一个我无法弄清楚的奇怪错误:

  

对于请求' POST / signIn' [无效的Json:没有要映射的内容   输入结束[来源:   akka.util.ByteIterator$ByteArrayIterator$$anon$1@7bf4f7c1;行:1,   栏:0]]

我的过滤器:

class SecuredFilter @Inject() (silhouette: Silhouette[DefaultEnv])(implicit val mat: Materializer, ec: ExecutionContext) extends Filter {
    def apply(nextFilter: RequestHeader => Future[Result])(requestHeader: RequestHeader): Future[Result] = {

        val action = silhouette.UserAwareAction.async { userAwareReq =>
            userAwareReq.identity match {
                case None => nextFilter(requestHeader)
                case Some(identity) =>
                    nextFilter(requestHeader).map { result =>
                        result.withHeaders( /* add headers*/ )
                    }
            }
        }               
        action(requestHeader).run
    }
}

过滤器类:

class Filters @Inject() (csrfFilter: CSRFFilter, securityHeadersFilter: SecurityHeadersFilter, 
        securedFilter: SecuredFilter) extends HttpFilters {

  override def filters: Seq[EssentialFilter] = Seq(csrfFilter, securityHeadersFilter, securedFilter)

}

1 个答案:

答案 0 :(得分:2)

差不多一年了,但由于我遇到了同样的问题,花了2天时间找到解决问题的方法,我觉得有责任表明。 这里的问题涉及解析请求主体超过1次:一个在过滤器中,第二次在Controller中。因此,解决方案是提供一个解析器(明确地)解析正文内容: play.api.mvc.BodyParsers.parse.empty

过滤器看起来像:

class SecuredFilter @Inject() (silhouette: Silhouette[DefaultEnv])(implicit val mat: Materializer, ec: ExecutionContext) extends Filter {
    def apply(nextFilter: RequestHeader => Future[Result])(requestHeader: RequestHeader): Future[Result] = {

        val action = silhouette.UserAwareAction.async(BodyParsers.parse.empty) { userAwareReq =>
            userAwareReq.identity match {
                case None => nextFilter(requestHeader)
                case Some(identity) =>
                    nextFilter(requestHeader).map { result =>
                        result.withHeaders( /* add headers*/ )
                    }
            }
        }               
        action(requestHeader).run
    }
}

希望这会节省一些人的时间。