Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.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
如何在SpringMVC中模拟安全上下文进行测试_Spring_Spring Mvc_Junit_Spring Security_Spring Test Mvc - Fatal编程技术网

如何在SpringMVC中模拟安全上下文进行测试

如何在SpringMVC中模拟安全上下文进行测试,spring,spring-mvc,junit,spring-security,spring-test-mvc,Spring,Spring Mvc,Junit,Spring Security,Spring Test Mvc,我需要测试一些受保护的URL,因此我需要在测试中设置一个模拟安全上下文(junit)。 特别是,我需要使用经过身份验证的用户对我的web应用程序执行一些GET和post。 下面是我的代码,我可以创建这样的安全上下文,但我需要将其注入到“MockMvc”对象中。 我在安全上下文中设置了身份验证对象,它就工作了,“SecurityContextHolder.getContext().getAuthentication().getPrincipal()”的输出结果是chanelle。evans@616

我需要测试一些受保护的URL,因此我需要在测试中设置一个模拟安全上下文(junit)。
特别是,我需要使用经过身份验证的用户对我的web应用程序执行一些GET和post。 下面是我的代码,我可以创建这样的安全上下文,但我需要将其注入到“MockMvc”对象中。
我在安全上下文中设置了身份验证对象,它就工作了,“SecurityContextHolder.getContext().getAuthentication().getPrincipal()”的输出结果是chanelle。evans@616747.com但是当我调用GET on/profile时,我有一个断言错误,因为我被重定向到我的登录页面,而不是/profile。
@WebAppConfiguration
@ContextConfiguration(locations = {"classpath:spring/security.xml", "classpath:spring/view.xml"})
@ActiveProfiles("default")
@RunWith(SpringJUnit4ClassRunner.class)
public class AuthenticationTest {

@Autowired
WebApplicationContext ctx;

private MockMvc mockMvc;

@Autowired
private FilterChainProxy springSecurityFilterChain;

@BeforeClass
public static void setUpBeforeClass() throws Exception {
}

@AfterClass
public static void tearDownAfterClass() throws Exception {
}

@Before
public void setUp() throws Exception {
    mockMvc = MockMvcBuilders.webAppContextSetup(ctx).addFilters(springSecurityFilterChain).build();

    //@formatter:off

    UserDetailsLogic userDetailsLogic = null;
    userDetailsLogic = ctx.getBean(UserDetailsLogic.class);
    final UserDetailsImp userDetailsImp = new UserDetailsImp();
    userDetailsImp.setAccountId(1001);
    userDetailsImp.setUserId(8001);
    userDetailsImp.setPassword("a378c92df7531df6fdf351f7ae1713f91f2dd2d45b9c6e1a8b02736ee3afec6595ff60465e9cb8da");
    userDetailsImp.setUsername("chanelle.evans@616747.com");
    userDetailsImp.setEmail("chanelle.evans@616747.com");

    final Collection<GrantedAuthorityImplementation> authorities= new ArrayList<GrantedAuthorityImplementation>();
    authorities.add(new GrantedAuthorityImplementation("ROLE_USER"));

    userDetailsImp.setAuthorities(authorities);

    userDetailsImp.setAccountNonExpired(true);
    userDetailsImp.setAccountNonLocked(true);
    userDetailsImp.setCredentialsNonExpired(true);
    userDetailsImp.setEnabled(true);

    final Authentication authToken = new UsernamePasswordAuthenticationToken (userDetailsImp.getUsername(), userDetailsImp.getPassword(), userDetailsImp.getAuthorities());
    SecurityContextHolder.getContext().setAuthentication(authToken);

    System.out.println("principal:"+SecurityContextHolder.getContext().getAuthentication().getPrincipal());      
    mockMvc.perform(get("/profile").principal(authToken)

            .contentType(MediaType.TEXT_HTML)

            .accept(MediaType.TEXT_HTML))

            .andDo(print())

            .andExpect(status().isOk())
            .andExpect(redirectedUrl(null))
            .andExpect(forwardedUrl(null));
    //@formatter:on     
}

@WebAppConfiguration
@ContextConfiguration(位置={“classpath:spring/security.xml”,“classpath:spring/view.xml”})
@ActiveProfiles(“默认”)
@RunWith(SpringJUnit4ClassRunner.class)
公共类身份验证测试{
@自动连线
WebApplicationContext ctx;
私有MockMvc-MockMvc;
@自动连线
私有过滤链Proxy springSecurityFilterChain;
@课前
public static void setUpBeforeClass()引发异常{
}
@下课
public static void tearDownAfterClass()引发异常{
}
@以前
public void setUp()引发异常{
mockMvc=MockMvcBuilders.webAppContextSetup(ctx).addFilters(springSecurityFilterChain.build();
//@格式化程序:关闭
UserDetailsLogic UserDetailsLogic=null;
userDetailsLogic=ctx.getBean(userDetailsLogic.class);
final UserDetailsImp UserDetailsImp=new UserDetailsImp();
userDetailsImp.setAccountId(1001);
userDetailsImp.setUserId(8001);
用户详细信息设置密码(“A378C92DF7531DF6FDF351F7AE1713F91F2DD2D45B9C6E1A8B02736EE3AEC6595FF60465E9CB8DA”);
userDetailsImp.setUsername(“chanelle。evans@616747.com");
userDetailsImp.setEmail(“chanelle。evans@616747.com");
最终收集权限=新ArrayList();
添加(新授权授权实施(“角色用户”);
userDetailsImp.setAuthorities(authorities);
userDetailsImp.setAccountNoExpired(true);
userDetailsImp.setAccountNonLocked(true);
userDetailsImp.SetCredentialsNoExpired(true);
userDetailsImp.setEnabled(true);
最终身份验证authToken=新用户名PasswordAuthenticationToken(userDetailsImp.getUsername(),userDetailsImp.getPassword(),userDetailsImp.getAuthories());
SecurityContextHolder.getContext().setAuthentication(authToken);
System.out.println(“主体:+SecurityContextHolder.getContext().getAuthentication().getPrincipal());
mockMvc.perform(get(“/profile”).principal(authToken)
.contentType(MediaType.TEXT\u HTML)
.accept(MediaType.TEXT_HTML))
.andDo(print())
.andExpect(状态().isOk())
.andExpect(重定向到URL(空))
.andExpect(forwardedUrl(null));
//@格式化程序:打开
}
我想我应该将身份验证对象放在MockMvc对象中,但我不知道如何

有人知道吗?

这是我几天前写的东西。我认为这可能会有帮助(我在登录表单上测试了同样的东西,在第二个请求中使用了会话)请参阅loginUser1Ok(…)

看中

.

添加到pom.xml中

<repository>
    <id>spring-snaspho</id>
    <url>http://repo.springsource.org/libs-milestone/</url>
</repository>

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-test</artifactId>
    <version>4.0.0.M1</version>
</dependency>

斯纳斯波温泉酒店
http://repo.springsource.org/libs-milestone/
org.springframework.security

,和。

你好,Emanuele,谢谢你的回答,我最终得到了完全相同的解决方案。你提供的代码示例对我非常有用!谢谢!你登录获取会话,然后进行端点调用的方式很好。我希望创建一个模拟会话,而不必执行登录,然后伪造凭据。登录n是由不同于我正在测试的服务执行的,因此这对我来说不起作用。您好,您应该能够创建一个模拟会话,并用您需要的所有内容填充它,然后在执行请求时将其设置为上下文。Spring Security在当前版本(4.0.1.RELEASE)中改进了测试支持。其文档可通过设置MockMvc和Spring Security()以及使用Mocked user()获得