12

私は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> 
4

3 に答える 3

20

必要なセッション属性にアクセスするには

th:text="${session._csrf.headerName}">
th:text="${session._csrf.token}">

春のタイムリーフを見る

テストで MockMvc を使用する場合は、csrf トークンを設定できます

mvc
.perform(post("/").with(csrf()))

Web セキュリティを見る

于 2016-02-29T19:41:26.187 に答える