Play Framework test controller with CSRF
Bài đăng này đã không được cập nhật trong 6 năm
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.
All rights reserved