2016-10-25 57 views
5

Fonksiyonel testlerimde küçük bir sorunla karşılaştım.Oyun çerçevesi 2.5'te CSRF Jetonu ile test isteği (Scala)

Oyunum var!

java.lang.RuntimeException: No CSRF token present! 

Ben bunları test etmek için yolları ile FakeRequest kullanıyorum: beklendiği gibi bazı formlarda CSRF doğrulama eklediğiniz 2.5 scala projesi ilişkili Scala-testi birimleri testi hata ile, başarısız

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

Testimi başarılı hale getirmek için CRSF Jetonunu nasıl ekleyebilirim?

+1

Siz uygulamayı geçersiz kılabilirsiniz. tion.conf' ve CSRF'yi atlamak için bazı başlıklar koydu, örneğin [https://www.playframework.com/documentation/2.5.x/ScalaCsrf#Plays-CSRF-protection]. Ya da [bu] (http://stackoverflow.com/a/19849420/4496364) cevabına bakın. –

+0

Merhaba, cevap verdiğiniz için teşekkürler! Ayrıca şablonları test ettiğimi ve her eylem bazında CSRF koruması yaptığımı da belirtmeliyim (dokümandaki ikinci örnek, filtreli ilk değil). Bu nedenle, şablonumun bir CSRF belirtecine sahip olması gerektiğinden, CSRF'yi atlayamam, ikinci testte olduğu gibi, daha önce test etmiş olduğum gibi (bu da kusuru düzeltmiş olmalıyım), ama oyun için 2.2. .1 ve Intellij bana bağırıyor "Sembolü çözemiyorsunuz SignedTokenProvider" Oyun 2.5'da bunu nasıl yapabilirim? – Argurth

+1

Bir çözüm buldum ve bir özellik yaptı :) İlgilendiğiniz yanıtın sonuna baktım ^^ – Argurth

cevap

5

Güncelleme

(teşekkürler ve üzgün kötü İngiliz, ben yerli değilim): gibi haui onun yorumunda şunları söyledi: onlar oyun versiyonu 2.6 benzer bir şey katma gibi

görünüyor. . Orada FakeRequest() withCSRFToken (Scala) ve 2.5.6 hala insanlar için Migration guide

açıklandığı gibi CSRFTokenHelper.addCSRFToken (requestBuilder) (Java), cevabım hala geçerli kullanabilirsiniz:

, https://stackoverflow.com/a/19849420/4496364 hatta bir özelliği yapılmış 2.5.6

Play, yani eğer birisi bir gün gerekir:

Yani, belirli bir süre için Play-scala sınıflarında baktıktan sonra, sonunda bu cevabı adapte etmenin bir yolunu buldum işte burada:

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)) 
    } 
} 
Kullanmak için

, sadece bu gibi onunla test sınıfını genişletmek:

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

sonra yerine

val fakeRequest = FakeRequest(/* params */) 

çağıran basitçe ben yapmaya çalıştı

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

çağrı Denetleyicideki addToken {} 'e benziyor :)

+3

Oyun sürümü 2.6'da benzer bir şey eklediklerine benziyor. Orada [Göç rehberi] (https://www.playframework.com/documentation/2.6) 'de açıklandığı gibi 'FakeRequest() .CSRFToken' (Scala) ve' CSRFTokenHelper.addCSRFToken (requestBuilder) '(Java) kullanabilirsiniz.x/Migration26 # testing-with-csrffilter) – haui

+0

Teşekkürler! Cevabımı düzenledim – Argurth