Playframework 在功能测试中,如何使用Play框架中的安全模块假冒经过身份验证的用户?
如何在Play Framework 1.2.3中的功能测试中伪造会话值 我正在做一个简单的测试,比如: 在运行测试之前,我设置了一个空白会话,希望它能成为测试的一部分: @Before public void setupHTTP() { Session.current.set(new Session()); } @以前 公共void setupHTTP(){ Session.current.set(新会话()); } @试验 public void testRedirectToUserHomeForAuthenticatedUserWhenBlankAction(){ 验证者(“test@user.com"); Response=GET(“/user/blank”); 资产重定向(响应,“/user/home”); } 方法authenticate(字符串userEmail)只需将密钥“username”放在会话映射中: authenticate(String userEmail) protected void authenticateUser(String userEmail) { // Put in session the email Session.current.get().put(USERNAME, userEmail); } 受保护的void authenticateUser(字符串userEmail){ //在电子邮件中加入会话 Session.current.get().put(用户名,userEmail); } 但是测试运行在不同的线程中,只要我能理解,并且看不到我设置的会话Playframework 在功能测试中,如何使用Play框架中的安全模块假冒经过身份验证的用户?,playframework,Playframework,如何在Play Framework 1.2.3中的功能测试中伪造会话值 我正在做一个简单的测试,比如: 在运行测试之前,我设置了一个空白会话,希望它能成为测试的一部分: @Before public void setupHTTP() { Session.current.set(new Session()); } @以前 公共void setupHTTP(){ Session.current.set(新会话()); } @试验 public void testRedirectToUserHo
如何在功能测试中伪造会话值?为什么要伪造,您可以通过在请求之间携带cookie来验证用户并在功能测试中处理其会话 差不多
Response response = makeRequest(...); // connexion request
Request request = newRequest(...); // new request
request.cookies = response.cookies
通过获取上一个响应的cookies,您可以进行会话我也遇到了同样的问题,但是在Play 2.0.4的测试中 我通过以下步骤和答案解决了问题,并通过检查API构建了以下解决方案:
@Test
public void listSomething() {
running(fakeApplication(inMemoryDatabase()), new Runnable() {
@Override
public void run() {
// LOGIN
final Map<String, String> data = new HashMap<String, String>();
data.put("email", "user@domain.com");
data.put("password", "userpassword");
Result result = callAction(
controllers.routes.ref.Application.authenticate(),
fakeRequest().withFormUrlEncodedBody(data));
// RECOVER COOKIE FROM LOGIN RESULT
final Cookie playSession = play.test.Helpers.cookie("PLAY_SESSION",
result);
// LIST SOMETHING (using cookie of the login result)
result = callAction(controllers.routes.ref.Application.list(),
fakeRequest().withCookies(playSession));
/*
* WAS RECEIVING 'SEE_OTHER' (303)
* BEFORE RECOVERING PLAY_SESSION COOKIE (BECAUSE NOT LOGGED IN).
*
* NOW, EXPECTED 'OK'
*/
assertThat(status(result)).isEqualTo(OK);
assertThat(contentAsString(result)).contains(
"Something found");
}
});
}
嗨,Seb,我在控制器中的操作应该在有或没有经过身份验证的用户的情况下表现不同。无论如何,我没有很好地理解你的答案,你能进一步解释一下如何在功能测试期间在会话中设置值吗?谢谢,我的解决方案不是在会话中输入值,而是对用户进行真正的身份验证,这样,您的功能测试将以与用户使用您的应用程序完全相同的方式进行。我试图在没有实现身份验证的情况下测试一些东西,但是功能测试应该测试系统各个部分的集成。我刚刚实现了身份验证,发布了一个POST(“/login”,params),然后在我可以发出任何其他请求之后,这些请求现在已经通过了身份验证。谢谢
@Test
public void listSomething() {
running(fakeApplication(inMemoryDatabase()), new Runnable() {
@Override
public void run() {
// LOGIN
final Map<String, String> data = new HashMap<String, String>();
data.put("email", "user@domain.com");
data.put("password", "userpassword");
Result result = callAction(
controllers.routes.ref.Application.authenticate(),
fakeRequest().withFormUrlEncodedBody(data));
// RECOVER COOKIE FROM LOGIN RESULT
final Cookie playSession = play.test.Helpers.cookie("PLAY_SESSION",
result);
// LIST SOMETHING (using cookie of the login result)
result = callAction(controllers.routes.ref.Application.list(),
fakeRequest().withCookies(playSession));
/*
* WAS RECEIVING 'SEE_OTHER' (303)
* BEFORE RECOVERING PLAY_SESSION COOKIE (BECAUSE NOT LOGGED IN).
*
* NOW, EXPECTED 'OK'
*/
assertThat(status(result)).isEqualTo(OK);
assertThat(contentAsString(result)).contains(
"Something found");
}
});
}
@Security.Authenticated(Secured.class)
public static Result list() {
return ok(list.render(...));
}