gpt4 book ai didi

scala - 在 Play 框架 2.5 (Scala) 中使用 CSRF token 测试请求

转载 作者:行者123 更新时间:2023-12-02 02:36:18 25 4
gpt4 key购买 nike

我在功能测试中遇到了一个小问题。

我有戏! 2.5 scala 项目,其中我在某些表单上添加了 CSRF 验证,关联的 scala-test 单元测试如预期失败,并出现错误:

java.lang.RuntimeException: No CSRF token present!

我正在使用 FakeRequest 和路由来测试它们:

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

如何添加 CRSF token 以使我的测试再次成功?

(谢谢,抱歉英语不好,我不是母语)

最佳答案

更新:就像 haui 在他的评论中所说:

Seems like they added something similar in play version 2.6. There you can use import play.api.test.CSRFTokenHelper._
FakeRequest().withCSRFToken
(Scala) and CSRFTokenHelper.addCSRFToken(requestBuilder) (Java) as explained in the Migration guide

对于仍在 2.5.6 的人,我的答案仍然适用:

所以,在查看 Play-scala 类一段时间后,我终于找到了一种方法来适应这个答案: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))
}
}

要使用它,只需用它扩展您的测试类,如下所示:

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

然后,而不是调用

val fakeRequest = FakeRequest(/* params */)

只需调用

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

我试图让它看起来像 Controller 中的 addToken{} :)

关于scala - 在 Play 框架 2.5 (Scala) 中使用 CSRF token 测试请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40251368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com