2016-10-25 27 views
5

Tôi đang gặp vấn đề với kiểm tra chức năng của mình.Yêu cầu thử nghiệm với Mã thông báo CSRF trong khung Play 2.5 (Scala)

Tôi có Play! Dự án 2,5 scala trong đó tôi thêm xác minh CSRF vào một số hình thức, kiểm tra các đơn vị scala kiểm tra liên quan đến thất bại, như mong đợi, với các lỗi:

java.lang.RuntimeException: No CSRF token present! 

Tôi đang sử dụng FakeRequest với các tuyến đường để kiểm tra chúng:

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

Tôi làm cách nào để thêm mã thông báo CRSF để hiển thị thử nghiệm thành công một lần nữa?

(Cảm ơn bạn, và xin lỗi vì tiếng xấu, tôi không có nguồn gốc)

+1

Bạn có thể ghi đè lên bạn 'applica tion.conf' và đặt một số tiêu đề để bỏ qua CSRF, như [ở đây] (https://www.playframework.com/documentation/2.5.x/ScalaCsrf#Plays-CSRF-protection). Hoặc xem câu trả lời [this] (http://stackoverflow.com/a/19849420/4496364). –

+0

Xin chào, cảm ơn vì đã trả lời tôi! Tôi nên có trước rằng tôi cũng đang thử nghiệm các mẫu và rằng tôi đang thực hiện bảo vệ CSRF trên cơ sở mỗi hành động (Trường hợp thứ hai trong tài liệu, không phải là trường hợp đầu tiên có bộ lọc). Do đó, tôi không thể bỏ qua CSRF vì mẫu của tôi cần mã thông báo CSRF để có mặt trong FakeRequest, như trong liên kết thứ hai, mà tôi đã thử nghiệm (cũng nên đặt trước quá, xin lỗi), nhưng nó là để chơi 2.2 .1, và Intellij đang la mắng tôi "Không thể giải quyết ký hiệu SignedTokenProvider" Bạn có ý tưởng làm thế nào tôi có thể làm điều đó khi chơi 2.5? – Argurth

+1

Tìm thấy một giải pháp và thực hiện một đặc điểm :) nhìn vào câu trả lời tôi thêm nếu bạn quan tâm ^^ – Argurth

Trả lời

5

Cập nhật: HaUI Giống như nói trong bình luận của ông:

Có vẻ như họ đã thêm vào một cái gì đó tương tự như trong phiên bản chơi 2.6. Ở đó bạn có thể sử dụng FakeRequest() withCSRFToken (Scala) và CSRFTokenHelper.addCSRFToken (requestBuilder) (Java) như được giải thích trong Migration guide

Đối với những người vẫn còn ở 2.5.6, câu trả lời của tôi vẫn còn được áp dụng:.

vì vậy, sau khi xem xét trong các lớp play-scala trong một thời gian nhất định, tôi cuối cùng đã tìm ra cách để thích nghi với câu trả lời này: https://stackoverflow.com/a/19849420/4496364 chơi 2.5.6

tôi thậm chí làm một đặc điểm, vì vậy nếu có ai cần đến nó một ngày nào đó, ở đây là:

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)) 
    } 
} 

Để sử dụng nó, bạn chỉ cần mở rộng lớp thử nghiệm của bạn với nó, như thế này:

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

sau đó, thay vì gọi

val fakeRequest = FakeRequest(/* params */) 

chỉ cần gọi

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

tôi đã cố gắng để làm cho nó trông giống như addToken {} trong Controller :)

+3

Có vẻ như họ đã thêm một cái gì đó tương tự trong phiên bản chơi 2.6. Ở đó bạn có thể sử dụng 'FakeRequest(). WithCSRFToken' (Scala) và' CSRFTokenHelper.addCSRFToken (requestBuilder) '(Java) như được giải thích trong [Hướng dẫn di chuyển] (https://www.playframework.com/documentation/2.6.x/Migration26 # testing-with-csrffilter) – haui

+0

Cảm ơn! Tôi đã chỉnh sửa câu trả lời của mình – Argurth

Các vấn đề liên quan