2016-08-18 10 views
1

Play FrameworkにREST APIを作成しており、認証用にSilhouette(JWT)を使用しています。カスタムフィルタを再生します。

すべてのセキュリティ保護された応答にヘッダーを追加する必要があります(ユーザーがログに記録されている場合のみ)。だから私はfilterを使ってそれらを追加すると考えました。要求のために

「POST/SIGNIN」[無効なJSON:: アッカ:[ソースに起因する 入力終了マッピングするコンテンツしかし、私は把握できなかったこの奇妙なエラーが発生します。 [email protected];行: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 
    } 
} 

フィルタクラス:ほぼ1年合格

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

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

} 
+0

フィルタはデフォルトパッケージに含まれていますか?もしそうでなければ、パッケージをPlayに知らせなければなりません - (これを参照してください)(https://www.playframework.com/documentation/2.5.x/ScalaHttpFilters#Using-filters) – Nio

+0

フィルタがトリガされ、含まれていないとエラーは発生しません... –

+0

プロンプトを解決しましたか? –

答えて

2

が、私は同じ問題に直面してきたのでその問題の解決に2日を費やして、私はそれを示す義務を感じる。 ここでの問題は、要求本体を1回以上解析することです.1つはフィルターで、もう1つはコントローラーでのものです。したがって、解決策は、本文の内容を解析しないパーサ(明示的)を与えることです: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 
    } 
} 

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

関連する問題