首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MockMvc测试期间使用正确的Spring安全配置

如何在MockMvc测试期间使用正确的Spring安全配置
EN

Stack Overflow用户
提问于 2018-07-04 17:33:55
回答 1查看 5.9K关注 0票数 3

我正在尝试测试我的@RestController之一的访问,它是由自定义的Security配置所保护的。我的用例如下:通过身份验证保护HTTP到GET/someEndpoint,但是对同一个端点的HTTPPOST请求不受保护。当我引导应用程序并用我的前端或邮递员测试它时,它工作得很好。

现在,我正在尝试用MockMvc编写带有安全配置的测试。我已经在StackOverflow上通过了很多答案,但是没有什么帮助我。

我的测试设置如下所示:

代码语言:javascript
复制
@RunWith(SpringRunner.class)
@WebMvcTest(controllers = MyController.class)
@WebAppConfiguration
@ContextConfiguration
public class AssessmentControllerTest {

    private MockMvc mockMvc;

    @Autowired
    private WebApplicationContext webApplicationContext;

    @Before
    public void init() throws Exception {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext)
                .alwaysDo(print())
                .apply(SecurityMockMvcConfigurers.springSecurity())
                .build();
    }

    // some test methods

}

通过这种设置,我的所有端点都是安全的,甚至HTTP POST也返回一个401而不是201。为了安全起见,我还启用了调试日志,在调试日志中,它说测试使用了default configure(HttpSecurity),在日志中找不到我的任何AntMatchers:

代码语言:javascript
复制
2018-07-04 19:20:02.829 DEBUG 2237 --- [           main] s.s.c.a.w.c.WebSecurityConfigurerAdapter : Using default configure(HttpSecurity). If subclassed this will potentially override subclass configure(HttpSecurity).
2018-07-04 19:20:03.097 DEBUG 2237 --- [           main] edFilterInvocationSecurityMetadataSource : Adding web access control expression 'authenticated', for org.springframework.security.web.util.matcher.AnyRequestMatcher@1
2018-07-04 19:20:03.127 DEBUG 2237 --- [           main] o.s.s.w.a.i.FilterSecurityInterceptor    : Validated configuration attributes
2018-07-04 19:20:03.130 DEBUG 2237 --- [           main] o.s.s.w.a.i.FilterSecurityInterceptor    : Validated configuration attributes
2018-07-04 19:20:03.161  INFO 2237 --- [           main] o.s.s.web.DefaultSecurityFilterChain     : Creating filter chain: org.springframework.security.web.util.matcher.AnyRequestMatcher@1, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@5a75ec37, org.springframework.security.web.context.SecurityContextPersistenceFilter@3f736a16, org.springframework.security.web.header.HeaderWriterFilter@529c2a9a, org.springframework.security.web.csrf.CsrfFilter@7f93dd4e, org.springframework.security.web.authentication.logout.LogoutFilter@707b1a44, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@26c89563, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@1e0a864d, org.springframework.security.web.authentication.www.BasicAuthenticationFilter@22ebccb9, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@53abfc07, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@4aa21f9d, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@2c05ff9d, org.springframework.security.web.session.SessionManagementFilter@26bbe604, org.springframework.security.web.access.ExceptionTranslationFilter@4375b013, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@a96d56c]
2018-07-04 19:20:03.236  INFO 2237 --- [           main] o.s.b.t.m.w.SpringBootMockServletContext : Initializing Spring FrameworkServlet ''
2018-07-04 19:20:03.237  INFO 2237 --- [           main] o.s.t.web.servlet.TestDispatcherServlet  : FrameworkServlet '': initialization started

一般情况下,在MockMvc测试期间是否可以使用具体的Spring安全配置,或者是否必须在使用@SpringBootTest进行测试期间启动整个Spring上下文?我正在使用(SpringBoot2.0.3)。

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-04 20:22:48

使用spring 2.x,就不可能再用属性切换安全性了。您必须编写自己的SecurityConfiguration,它必须添加到测试上下文中。这个安全配置应该允许没有身份验证的任何请求。

代码语言:javascript
复制
@Configuration
@EnableWebSecurity
public class TestSecurityConfiguration extends WebSecurityConfigurerAdapter{
   @Override
   protected void configure(HttpSecurity http) throws Exception {
   http.csrf().disable().authorizeRequests().anyRequest().permitAll();
   }

   @Override
   public void configure(WebSecurity web) throws Exception{
     web.debug(true);
   }
}

测试类注释:

代码语言:javascript
复制
@ContextConfiguration(classes = { ..., TestSecurityConfiguration.class })
public class MyTests {...
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51178645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档