【问题标题】:In a functional test, how can I fake an authenticated user using Secure module in Play Framework?在功能测试中,如何使用 Play Framework 中的 Secure 模块伪造经过身份验证的用户?
【发布时间】:2011-11-14 01:27:44
【问题描述】:

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

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

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

@前 公共无效 setupHTTP() { 会话.current.set(新会话()); } @测试 公共无效 testRedirectToUserHomeForAuthenticatedUserWhenBlankAction() { authenticateUser("test@user.com"); 响应响应 = GET("/user/blank"); assertRedirected(响应,“/user/home”); }

方法

authenticate(String userEmail)
只需将密钥“用户名”放入会话映射中: 受保护的无效身份验证用户(字符串用户电子邮件){ // 将电子邮件放入会话 Session.current.get().put(USERNAME, userEmail); }

但测试在不同的线程中运行,只要我能理解,并且看不到我设置的会话......

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

【问题讨论】:

    标签: playframework


    【解决方案1】:

    我遇到了同样的问题,但在 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(...));
    }
    

    【讨论】:

      【解决方案2】:

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

      类似

      Response response = makeRequest(...); // connexion request
      Request request = newRequest(...);  // new request
      request.cookies = response.cookies
      

      通过获取先前响应的 cookie,您可以携带会话

      【讨论】:

      • 嗨 Seb,我在控制器中的操作在是否有经过身份验证的用户的情况下应该表现不同。无论如何,我不太了解您的答案,您能否进一步解释在功能测试期间如何在会话中设置值?谢谢
      • 我的解决方案不是将值放入会话中,而是真正对用户进行身份验证,因此您的功能测试的行为方式与用户使用您的应用程序的方式完全相同
      • 你是对的。我试图在尚未实现身份验证的情况下测试某些东西,但功能测试应该测试系统各个部分的集成。我刚刚实现了身份验证,发出一个 POST("/login", params) ,然后我可以发出任何其他请求,这些请求现在已经过身份验证。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-14
      • 1970-01-01
      • 1970-01-01
      • 2019-02-16
      • 2015-01-14
      • 2013-10-27
      相关资源
      最近更新 更多