gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:52:11 25 4
gpt4 key购买 nike

我需要测试一些 protected url,因此我需要在我的测试 (junit) 中设置一个模拟安全上下文。
特别是我需要使用经过身份验证的用户对我的 Web 应用程序执行一些获取和发布。下面是我的代码,我可以创建这样的安全上下文,但我需要将它注入(inject)到“MockMvc”对象中。
我在安全上下文中设置了身份验证对象并且它起作用了,'SecurityContextHolder.getContext().getAuthentication().getPrincipal()' 的输出结果是 chanelle.evans@616747.com 但是当我在/profile 上调用 GET 时,我有一个断言错误,因为我被重定向到我的登录页面,而不是/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
}

我想我应该把我的身份验证对象放在 MockMvc 对象中,但我不知道如何
有人知道吗?

最佳答案

这是我几天前写的。我认为这可能会有所帮助(我针对登录表单测试了相同的内容,使用 session 进行第二个请求)请参阅 loginUser1Ok(..))

MvcTest.java

m4nuv/easy-bank .

关于spring - 如何在 Spring MVC 中模拟安全上下文以进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18270973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com