Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring SecurityContextHolder将正确的登录用户返回为;“匿名”;在junit测试中_Spring - Fatal编程技术网

Spring SecurityContextHolder将正确的登录用户返回为;“匿名”;在junit测试中

Spring SecurityContextHolder将正确的登录用户返回为;“匿名”;在junit测试中,spring,Spring,我尝试了两种方法来进行控制器单元测试 M1: M2: 不,它不是一个bug;这是正确的SecurityContextHolder是一个singletonbean,但在JUnit测试中,它是线程范围而不是会话范围。对于JUnit,您需要在之前设置一些内容 有一些方法,您可以使用Mokito并为SecurityContextHolder设置一个SecurityContext对象: Authentication authentication = Mockito.mock(Authentication.

我尝试了两种方法来进行控制器单元测试

M1:

M2:


,它不是一个bug;这是正确的
SecurityContextHolder
是一个singletonbean,但在JUnit测试中,它是线程范围而不是会话范围。对于JUnit,您需要在之前设置一些内容

有一些方法,您可以使用Mokito并为
SecurityContextHolder
设置一个
SecurityContext
对象:

Authentication authentication = Mockito.mock(Authentication.class);
SecurityContext securityContext = Mockito.mock(SecurityContext.class);
Mockito.when(securityContext.getAuthentication()).thenReturn(authentication);
SecurityContextHolder.setContext(securityContext);
//Now you can access the real user loggedin

@WithUserDetails(value=“Tom”,userDetailsServiceBeanName=“customizedUserDetailsService”)
不应返回匿名用户。第二个方法mockXXX没有通过customizedUserDetailsService bean,它返回所需的pojo。这样,您就不必使用
@WithUserDetails
,您可以通过
mvc.perform(post(uri))设置它..
mvc.with方法诱导一个Spring用户,而不是一个定制的用户bean。我需要那个bean。
SecurityContextHolder setContext
方法运行2次,第一次参数上下文正确,第二次参数上下文导致最终的“匿名”。我仍然认为这是一个bug,不应该发生在
@WithUserDetails
上。我会在有时间的时候彻底检查它;我发布的解决方案和代码来自我以前的经验,我希望它有用,很抱歉没有提供更多帮助
@Test
public void testGetworkList() throws Exception {

    List<GrantedAuthority> list = ...;
    String uri = "/foo";

    ResultActions perform = mvc.perform(post(uri).with(csrf().asHeader()).with(user("Tom").roles("CP").authorities(list)));
}

@Before
public void setup() {
    mvc = MockMvcBuilders.webAppContextSetup(context)
        .apply(SecurityMockMvcConfigurers.springSecurity()) 
        .build();
}
@Test
@WithUserDetails(value="Tom", userDetailsServiceBeanName = "customizedUserDetailsService")
public void testGetworkList() {
    String uri = ...;
    ResultActions result = mvc.perform(post(uri).with(csrf()));
}
Authentication authentication = Mockito.mock(Authentication.class);
SecurityContext securityContext = Mockito.mock(SecurityContext.class);
Mockito.when(securityContext.getAuthentication()).thenReturn(authentication);
SecurityContextHolder.setContext(securityContext);
//Now you can access the real user loggedin