2016-10-25 1 views
5

제 기능 테스트에 약간의 문제가 있습니다.Play 프레임 워크 2.5 (스칼라)에서 CSRF 토큰으로 테스트 요청

나는 놀이가 있습니다!

java.lang.RuntimeException: No CSRF token present! 

내가 그들을 테스트하기 위해 경로로 FakeRequest을 사용하고 있습니다 : 예상대로 내가 어떤 모양에 CSRF 검증을 추가하는 2.5 스칼라 프로젝트는 관련 스칼라 테스트 단위 테스트는 오류, 실패

val fakeRequest = FakeRequest(GET, s"/backOffice/login") 
val Some(result) = route(app, fakeRequest) 

테스트를 다시 성공적으로 수행하기 위해 CRSF 토큰을 어떻게 추가 할 수 있습니까?

+1

당신은 당신을 덮어 쓸 수 있습니다. 여기에 [https://www.playframework.com/documentation/2.5.x/ScalaCsrf#Plays-CSRF-protection]과 같이 CSRF를 우회 할 헤더를 설정하십시오. 또는 [이] (http://stackoverflow.com/a/19849420/4496364) 대답을보십시오. –

+0

안녕하세요, 저에게 답변 해 주셔서 감사합니다! 필자도 템플릿을 테스트하고 있으며 액션 단위로 CSRF 보호를 수행하고 있음을 입증해야합니다 (문서의 두 번째 사례, 필터가있는 첫 번째 사례는 아닙니다). 이 때문에 필자는 이미 CSRF를 우회 할 수는 없다. 필자가 이미 테스트 한 두 번째 링크처럼 CSRF 토큰이 FakeRequest에 있어야하기 때문이다. (너무 미안하다.) .1, Intellij가 나에게 소리 쳤다 "SignedTokenProvider 심볼을 해결할 수 없음" 연극 2.5에서 어떻게 할 수 있을지 생각해 보셨습니까? – Argurth

+1

해결책을 찾고 특성을 만들었습니다 :) 대답을보세요. 관심이 있으시다면 ^^ – Argurth

답변

5

업데이트를

는 (감사합니다, 미안 나쁜 영어, 나는 네이티브 아니에요) : 마찬가지로 깃발을 올려 그의 주석에서 말했다 : 그들은 플레이 버전 2.6에서 비슷한 추가처럼

이 보인다. . 거기 당신은 FakeRequest() withCSRFToken (스칼라) 및 2.5.6에서 여전히 사람들을위한 Migration guide

에 설명 된대로 CSRFTokenHelper.addCSRFToken (requestBuilder) (자바), 내 대답은 여전히 ​​적용 사용할 수 있습니다

, https://stackoverflow.com/a/19849420/4496364 나는 심지어 특성을 만들어 2.5.6

플레이, 그렇다면 누군가가 언젠가 필요합니다

그래서, 일정 시간 동안 플레이 - 스칼라 클래스에보고 후, 나는 마침내이 대답을 적용하는 방법을 발견 여기에 :

import play.api.Application 
import play.api.test.FakeRequest 
import play.filters.csrf.CSRF.Token 
import play.filters.csrf.{CSRFConfigProvider, CSRFFilter} 

import scala.language.postfixOps 

trait CSRFTest { 
    def addToken[T](fakeRequest: FakeRequest[T])(implicit app: Application) = { 
    val csrfConfig  = app.injector.instanceOf[CSRFConfigProvider].get 
    val csrfFilter  = app.injector.instanceOf[CSRFFilter] 
    val token   = csrfFilter.tokenProvider.generateToken 

    fakeRequest.copyFakeRequest(tags = fakeRequest.tags ++ Map(
     Token.NameRequestTag -> csrfConfig.tokenName, 
     Token.RequestTag  -> token 
    )).withHeaders((csrfConfig.headerName, token)) 
    } 
} 
그것을 사용하려면 53,691,363,210

, 단순히 같이, 그것으로 테스트 클래스를 확장 :

class LoginSpec extends PlaySpec with OneAppPerSuite /* or whatever OneApp */ with CSRFTest 

을 한 후, 대신

val fakeRequest = FakeRequest(/* params */) 

를 호출 단순히 내가 만들려고

val fakeRequest = addToken(FakeRequest(/* params */)) 

전화 그것은 컨트롤러에서 addToken {}처럼 보입니다.

+3

그들은 연극 2.6에서 비슷한 것을 추가 한 것처럼 보입니다. [Migration guide] (https://www.playframework.com/documentation/2.6)에서 설명한대로'FakeRequest() .CSRFToken' (스칼라)와'CSRFTokenHelper.addCSRFToken (requestBuilder)'(자바)를 사용할 수 있습니다.x/Migration26 # testing-with-csrffilter) – haui

+0

고마워! 내 대답을 편집했습니다. – Argurth

관련 문제