首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Spring MVC中模拟安全上下文进行测试

如何在Spring MVC中模拟安全上下文进行测试
EN

Stack Overflow用户
提问于 2013-08-16 18:15:35
回答 2查看 24K关注 0票数 18

我需要测试一些受保护的urls,因此我需要在我的测试中设置一个模拟安全上下文(junit)。

特别是,我需要使用经过身份验证的用户对我的web应用程序执行一些gets和post操作。下面是我的代码,我能够创建这样的安全上下文,但我需要将其注入到'MockMvc‘对象中。

我在安全上下文中设置了身份验证对象,它可以工作,'SecurityContextHolder.getContext().getAuthentication().getPrincipal()‘的输出结果是chanelle.evans@616747.com,但是当我在/profile上调用GET时,我有一个断言错误,因为我被重定向到我的登录页面,而不是/profile。

代码语言:javascript
复制
@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     
}

我想我应该将身份验证对象放在MockMvc对象中,但我不知道如何将其放入

有谁知道吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-16 20:18:46

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

请参阅中的MvcTest.java

m4nuv/easy-bank

票数 12
EN

Stack Overflow用户

发布于 2014-05-15 02:00:34

在pom.xml中添加

代码语言:javascript
复制
<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>

并使用org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors进行授权请求。See the sample usage hereSpring.io jira ticket SEC-2592

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18270973

复制
相关文章

相似问题

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