在功能测试中,如何在Play Framework中使用安全模块伪造经过身份验证的用户?

时间:2011-11-14 01:27:44

标签: playframework

如何在Play Framework 1.2.3中的功能测试中伪造会话值?

我正在做一个简单的测试,如:

在运行测试之前,我设置了一个空白会话,希望它能成为测试的一部分:

@Before
public void setupHTTP() {
   Session.current.set(new Session());
}
@Test
public void testRedirectToUserHomeForAuthenticatedUserWhenBlankAction() {
    authenticateUser("test@user.com");
    Response response = GET("/user/blank");
    assertRedirected(response, "/user/home");
}

方法

authenticate(String userEmail)
只需将关键字“用户名”放在会话地图中:

protected void authenticateUser(String userEmail) {
        // Put in session the email
        Session.current.get().put(USERNAME, userEmail);
}

但是测试运行在另一个线程中,只要我能理解,并且没有看到我设置的会话......

如何在功能测试中伪造会话值?

2 个答案:

答案 0 :(得分:3)

我遇到了同样的问题,但是在Play 2.0.4的测试中。

我按照SebCodemwnci的答案解决了这个问题,并构建了检查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");
        }
    });
}

Application.list()是这样的:

@Security.Authenticated(Secured.class)
public static Result list() {
   return ok(list.render(...));
}

答案 1 :(得分:2)

为什么要伪造,你可以通过在请求之间携带cookie来验证用户并在功能测试中使用其会话。

这样的东西
Response response = makeRequest(...); // connexion request
Request request = newRequest(...);  // new request
request.cookies = response.cookies

通过获取您之前回复的Cookie来进行会话