12/08/2018, 16:52

Play Framework test controller with CSRF

Trên play framework, chúng ta có thể viết unit test cho controller theo như hướng dẫn từ trang play framework như sau: https://www.playframework.com/documentation/2.6.x/JavaTest Tuy nhiên trong khi phát triển, để tăng security cho hệ thống, chúng ta muốn apply CSRF vào hệ thống, https://www.playf ...

Trên play framework, chúng ta có thể viết unit test cho controller theo như hướng dẫn từ trang play framework như sau: https://www.playframework.com/documentation/2.6.x/JavaTest

Tuy nhiên trong khi phát triển, để tăng security cho hệ thống, chúng ta muốn apply CSRF vào hệ thống, https://www.playframework.com/documentation/2.6.x/JavaCsrf

Khi đó, chúng ta sẽ cần add thêm csrf field khi thực hiện post method lên hệ thống. Với ngôn ngữ scalar, chúng ta có thể làm theo hướng dẫn như sau: https://stackoverflow.com/questions/19838347/testing-scala-play-2-2-1-controllers-with-csrf-protection

Nhưng với java thì chúng ta cần phải implement đoạn sử lý trên như thế nào? Các bạn có thể làm như sau:

@Test
    public void testUpdateInitSettingWhenUpdateError() {
        Map<String, String> formData = getSuccessFormData();

        Http.RequestBuilder request = fakeRequest().bodyForm(formData).method("POST").uri(controllers.routes.TestController.updateData().url());
        Result result = route(app, addCSRF(request, app));
        assertThat(result.status(), is(OK));
    }

Ở đây chúng ta đã thực hiện fake một request lên server test, chúng ta add csrf vào cho request fake này như sau:

   public Http.RequestBuilder addCSRF(Http.RequestBuilder request, Application app) {
        CSRFFilter csrfFilter = app.injector().instanceOf(CSRFFilter.class);
        CSRFConfig csrfConfig = app.injector().instanceOf(CSRFConfigProvider.class).get();
        String token = csrfFilter.tokenProvider().generateToken();
        String tokenName = csrfConfig.tokenName();
        
        Map<String, String> tags = request.tags();
        tags.put("CSRF_TOKEN_NAME", tokenName);
        tags.put("CSRF_TOKEN", token);
        return request.tags(tags);
    }

Mục tiêu của đoạn code trên là thực hiện việc generateToken -> chúng ta sẽ có csrf token và sau đó add vào fake request. -> Pass được CsrfFilter khi thực hiện unit test cho controller.

0