私は2つのメタを持つビューを持っています(私はタイムリーフを使用しています):
<meta name="_csrf" th:content="${_csrf.token}" />
<meta name="_csrf_header" th:content="${_csrf.headerName}" />
私のテストコントローラーでは、これを行います:
HttpSessionCsrfTokenRepository httpSessionCsrfTokenRepository = new HttpSessionCsrfTokenRepository();
CsrfToken csrfToken2 = httpSessionCsrfTokenRepository.generateToken(new MockHttpServletRequest());
CustomUser user = new CustomUser();
user.setName("foo");
user.setSurname("fooo");
List<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>();
grantedAuthorities.add(new SimpleGrantedAuthority("role"));
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken("foo", "fooo", grantedAuthorities);
token.setDetails(user);
MockHttpSession session = new MockHttpSession();
session.setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, new MockSecurityContext(token));
session.setAttribute("_csrf", csrfToken2);
this.mockMvc.perform(post("/foo/update")
.param("param", "asdfasd")
....
.session(session)
)
.andExpect(view().name(("foo/detail"))).andExpect(model().hasErrors())
テストを実行すると、次のエラーが発生します (トークンが見つからないか、null です)。
org.springframework.web.util.NestedServletException: リクエストの処理に失敗しました。入れ子になった例外は org.thymeleaf.exceptions.TemplateProcessingException: Exception Evaluation SpringEL expression: "_csrf.token" (layout/default:4) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:979) at org. org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java: 843) org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:65) で javax.servlet.http.HttpServlet.service(HttpServlet.java:790) で org.springframework.mock.web.MockFilterChain $ServletFilterProxy.
私は一時的な解決策を見つけましたが、それは良い解決策ではありません..:
<th:block th:if="${_csrf}">
<meta name="_csrf" th:content="${_csrf.token}" />
<meta name="_csrf_header" th:content="${_csrf.headerName}" />
</th:block>