2016-10-25 16 views
5

में सीएसआरएफ टोकन के साथ परीक्षण अनुरोध मैं अपने कार्यात्मक परीक्षण के साथ एक छोटी सी समस्या पर फंस गया हूं।प्ले फ्रेमवर्क 2.5 (स्कैला)

मेरे पास एक प्ले है! 2.5 स्केला परियोजना जिसमें मैं कुछ रूपों पर CSRF सत्यापन जोड़ने, जुड़े स्केला परीक्षण इकाइयों परीक्षण, में विफल रहा है के रूप में उम्मीद, त्रुटि के साथ:

java.lang.RuntimeException: No CSRF token present! 

मैं मार्गों के साथ FakeRequest उपयोग कर रहा हूँ ताकि उन्हें परीक्षण करने के लिए:

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

मैं अपने परीक्षण को दोबारा सफल करने के लिए सीआरएसएफ टोकन कैसे जोड़ सकता हूं?

(धन्यवाद, और खेद बुरा अंग्रेजी के लिए, मैं देशी नहीं कर रहा हूँ)

+1

आप 'applica को ओवरराइड कर सकते हैं tion.conf' और सीएसआरएफ को बाईपास करने के लिए कुछ शीर्षलेख सेट करें, जैसे [यहां] (https://www.playframework.com/documentation/2.5.x/ScalaCsrf#Plays-CSRF-protection)। या [यह] देखें (http://stackoverflow.com/a/19849420/4496364) उत्तर। –

+0

हाय, मुझे जवाब देने के लिए धन्यवाद! मुझे यह सटीक होना चाहिए था कि मैं टेम्पलेट का परीक्षण भी कर रहा हूं, और मैं प्रति क्रिया के आधार पर सीएसआरएफ सुरक्षा कर रहा हूं (दस्तावेज में दूसरा मामला, फ़िल्टर के साथ पहला नहीं)। इसके कारण, मैं केवल सीएसआरएफ को बाईपास नहीं कर सकता क्योंकि मेरे टेम्पलेट को एक सीएसआरएफ टोकन को FakeRequest में उपस्थित होने की आवश्यकता है, जैसे कि दूसरे लिंक में, जिसे मैंने पहले ही परीक्षण किया था (उसे भी माफ कर देना चाहिए था), लेकिन यह 2.2 के लिए है .1, और इंटेलिज मुझ पर चिल्ला रहा है "प्रतीक संकेतित नहीं कर सकता हस्ताक्षर TokenProvider" क्या आपको पता है कि मैं इसे 2.5 में कैसे कर सकता हूं? – Argurth

+1

एक समाधान मिला और एक विशेषता बनाई :) यदि आप रुचि रखते हैं तो मैंने जो जवाब जोड़ा है उसे देखें ^^ – Argurth

उत्तर

5

अद्यतन: जैसा haui उसकी टिप्पणी में कहा:

लगता है जैसे वे खेलने संस्करण 2.6 में कुछ इसी तरह जोड़ा। । वहाँ आप FakeRequest() withCSRFToken (स्काला) और CSRFTokenHelper.addCSRFToken (requestBuilder) (जावा) Migration guide

लोग हैं, जो 2.5.6 में अब भी कर रहे हैं के लिए में बताई गई विधि, मेरा उत्तर अभी भी लागू उपयोग कर सकते हैं:

तो, एक निश्चित समय के लिए प्ले-स्केला कक्षाओं में देखने के बाद, मैं अंत में इस उत्तर अनुकूल करने के लिए एक रास्ता मिल गया: 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)) 
    } 
} 
तो, बजाय

val fakeRequest = FakeRequest(/* params */) 

बुलाने की

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

बस फोन

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

मैं करने की कोशिश की: +५३६९१३६३२१०

इसका इस्तेमाल करने के लिए बस अपने परीक्षण वर्ग इसके साथ, इस तरह का विस्तार यह नियंत्रक में addToken {} जैसा दिखता है :)

+3

ऐसा लगता है जैसे उन्होंने प्ले संस्करण 2.6 में कुछ समान जोड़ा। वहां आप [माइक्रोसॉफ्ट गाइड] (https://www.playframework.com/documentation/2.6) में समझाए गए अनुसार 'FakeRequest() .CSRFToken' (स्कैला) और 'CSRFTokenHelper.addCSRFToken (requestBuilder)' (Java) का उपयोग कर सकते हैं।एक्स/माइग्रेशन 26 # परीक्षण-के-सीएसआरफिल्टर) – haui

+0

धन्यवाद! मैंने अपना जवाब संपादित किया – Argurth

संबंधित मुद्दे