我在测试使用 Play 的 CSRF 保护的控制器时遇到了一些问题。为了证明这一点,我创建了一个非常简单的 Play 应用程序,该应用程序几乎不会出现问题。
https://github.com/adamnfish/csrftest
完整的详细信息在该存储库的 README 中,但在这里总结一下:
考虑一个设计用于处理表单提交的控制器。它有一个使用 CSRFAddToken 的 GET 方法和一个使用 CSRFCheck 的 POST 方法。前者将 CSRF Token 添加到请求中,以便可以将包含有效令牌的表单字段放入呈现的视图中。当提交该表单时,如果 CSRF 检查通过并且提交有效,则会发生其他事情(通常是重定向)。如果表单提交无效,则会重新显示表单提交以及任何错误,以便用户可以更正表单并再次提交。
这很好用!
但是,在测试中,我们现在遇到了一些问题。要测试控制器,您可以在测试中向它传递一个虚假请求。可以通过将 nocheck 标头添加到假请求来跳过 CSRF 检查本身,但由于没有可用于生成表单字段的令牌,因此无法呈现视图。测试失败,出现 RuntimeException,“Missing CSRF Token (csrf.scala:51)”。
鉴于它在实际运行但在测试中不起作用时,似乎这肯定是 FakeRequests 在 Play 测试中运行的方式存在问题,但我可能做错了什么。我已经实现了 http://www.playframework.com/documentation/2.2.1/ScalaCsrf 中描述的 CSRF 保护和http://www.playframework.com/documentation/2.2.1/ScalaFunctionalTest中描述的测试. 如果有人设法测试受 CSRF 保护的表单,我将不胜感激。