【问题标题】:Play custom filter JSON error播放自定义过滤器 JSON 错误
【发布时间】:2016-12-25 09:49:20
【问题描述】:

我正在 Play Framework 中创建一个 REST API,并借助 Silhouette 进行身份验证(JWT)。

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

对于请求 'POST /signIn' [Invalid Json: No content to map due to [来源: 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)

}

【问题讨论】:

标签: scala playframework silhouette


【解决方案1】:

过去了将近一年,但由于我遇到了同样的问题并花了 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
    }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 2018-08-06
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多