2016-08-18 39 views
1

我在Play Framework中爲REST API提供了Silhouette用於身份驗證(JWT)的幫助。播放自定義過濾器JSON錯誤

我需要爲每個安全響應添加一些標頭(僅當用戶登錄時)。所以我想用filter來添加它們。但是,我得到這個奇怪的錯誤,我無法弄清楚:

對於請求「POST /簽到」 [無效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 
    } 
} 

過濾器類:

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天的時間尋找解決方案,我覺得有責任展示它。 這裏的問題涉及解析請求主體超過一次:一個在過濾器中,第二個在控制器中。因此,解決方案是給解析器(明確)不解析正文內容: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 
    } 
} 

希望這將節省別人的時間。