1

Silhouette for authentication(JWT) を使用して、 Play FrameworkでREST API を作成しています。

すべての安全な応答にいくつかのヘッダーを追加する必要があります (ユーザーがログインしている場合のみ)。そこで、フィルターを使用してそれらを追加することを考えました。しかし、私は理解できなかったこの奇妙なエラーを受け取ります:

リクエスト 'POST /signIn' の場合 [無効な Json: No content to map due to end-of-input at [Source: 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)

}
4

1 に答える 1

2

ほぼ1年が経過しましたが、同じ問題に直面し、その問題の解決策を見つけるのに2日を費やしたので、それを示す義務があると感じています. ここでの問題は、リクエストの本文を複数回解析することに関連しています。1 回目はフィルターで、2 回目はコントローラーで解析します。したがって、解決策は、本体のコンテンツを解析しないパーサー (明示的に) を与えることです: 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
    }
}

これが誰かの時間を節約することを願っています。

于 2017-05-25T16:11:11.830 に答える