(window.webpackJsonp=window.webpackJsonp||[]).push([[662],{1093:function(e,t,s){"use strict";s.r(t);var a=s(56),r=Object(a.a)({},(function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[s("h3",{attrs:{id:"安全模型cresulthandlers"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安全模型cresulthandlers"}},[e._v("#")]),e._v(" 安全模型cresulthandlers")]),e._v(" "),s("p",[e._v("Spring 安全性提供了一些"),s("code",[e._v("ResultHandler")]),e._v("s的实现方式。为了使用 Spring Security的"),s("code",[e._v("ResultHandler")]),e._v("s实现,确保使用以下静态导入:")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("import static org.springframework.security.test.web.servlet.response.SecurityMockMvcResultHandlers.*;\n")])])]),s("h4",{attrs:{id:"导出securitycontext"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#导出securitycontext"}},[e._v("#")]),e._v(" 导出SecurityContext")]),e._v(" "),s("p",[e._v("通常情况下,我们希望查询存储库,以查看某些"),s("code",[e._v("MockMvc")]),e._v("请求是否确实在数据库中持续存在。在某些情况下,我们的存储库查询使用"),s("RouterLink",{attrs:{to:"/features/integrations/data.html"}},[e._v("Spring Data Integration")]),e._v("基于当前用户的用户名或任何其他属性来过滤结果。让我们来看一个例子:")],1),e._v(" "),s("p",[e._v("存储库接口:")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v('private interface MessageRepository extends JpaRepository {\n\t@Query("SELECT m.content FROM Message m WHERE m.sentBy = ?#{ principal?.name }")\n\tList findAllUserMessages();\n}\n')])])]),s("p",[e._v("我们的测试场景:")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v('mvc\n\t.perform(post("/message")\n\t\t.content("New Message")\n\t\t.contentType(MediaType.TEXT_PLAIN)\n\t)\n\t.andExpect(status().isOk());\n\nList userMessages = messageRepository.findAllUserMessages();\nassertThat(userMessages).hasSize(1);\n')])])]),s("p",[e._v("这个测试不会通过,因为在我们的请求完成后,"),s("code",[e._v("SecurityContextHolder")]),e._v("将被过滤链清除。然后,我们可以将"),s("code",[e._v("TestSecurityContextHolder")]),e._v("导出到"),s("code",[e._v("SecurityContextHolder")]),e._v(",并根据需要使用它:")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v('mvc\n\t.perform(post("/message")\n\t\t.content("New Message")\n\t\t.contentType(MediaType.TEXT_PLAIN)\n\t)\n\t.andDo(exportTestSecurityContext())\n\t.andExpect(status().isOk());\n\nList userMessages = messageRepository.findAllUserMessages();\nassertThat(userMessages).hasSize(1);\n')])])]),s("table",[s("thead",[s("tr",[s("th"),e._v(" "),s("th",[e._v("记住在两次测试之间清除"),s("code",[e._v("SecurityContextHolder")]),e._v(",否则它可能会在测试之间泄漏。")])])]),e._v(" "),s("tbody")]),e._v(" "),s("p",[s("RouterLink",{attrs:{to:"/spring-security/result-matchers.html"}},[e._v("安全结果匹配器")]),s("RouterLink",{attrs:{to:"/appendix/index.html"}},[e._v("Appendix")])],1)])}),[],!1,null,null,null);t.default=r.exports}}]);