如何使用 Java 中的 Spring 切换用户以进行测试?
How to switch user using Spring in Java for testing purposes?
我使用 Spring 安全性 SwitchUserFilter
编写了功能。在应用程序中,我可以使用 /j_spring_security_switch_user?j_username=xxx
URL 切换用户并使用 /j_spring_security_exit_user
返回上一个。
我还实现了几种依赖于切换用户事实的方法,所以我想为它们编写单元测试。
因此我的问题是如何在 jUnit 测试环境中切换用户?
如果您想要集成测试,您应该考虑使用自定义 http 客户端,或者如果您的测试逻辑依赖于它,甚至是像 Selenium 这样的 GUI 驱动程序。
如果我们在谈论单元测试,请参考 Springs
http://spring.io/blog/2014/05/07/preview-spring-security-test-method-security
文档,他们支持大量测试,@WithMockUser 注释似乎是您正在寻找的,它允许您指定应该使用哪个角色或用户运行此测试。
我编写了让用户准备 SwitchUserGrantedAuthority
并让他登录的方法。对于我的测试目的来说它似乎工作正常,但是任何提示和评论将不胜感激。
@SuppressWarnings({ "rawtypes", "unchecked" })
private User logAdminAsUser(User admin, String roleName) {
SecurityContextHolder.getContext().setAuthentication(
new TestingAuthenticationToken(admin, null, "ROLE_ADMIN"));
Authentication adminAuth = SecurityContextHolder.getContext().getAuthentication();
SwitchUserGrantedAuthority switchUserGrantedAuthority =
new SwitchUserGrantedAuthority("ROLE_ADMIN", adminAuth);
List authorities = new LinkedList();
authorities.add(switchUserGrantedAuthority);
User user = populator.storeUser("ROLE_USER");
SecurityContextHolder.getContext().setAuthentication(
new TestingAuthenticationToken(user, null, authorities));
return user;
}
我用过这个:
private void switchUser(User user, String roleName)
{
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Collection<GrantedAuthority> authorities =
new ArrayList<>();
GrantedAuthority ga = new SimpleGrantedAuthority(roleName);
authorities.add(ga);
Authentication result = new UsernamePasswordAuthenticationTokenExt(
user,
authentication.getCredentials(),
null,
System.currentTimeMillis()
);
SecurityContextHolder.getContext().setAuthentication( result );
}
其中User
是新用户,roleName
是要设置的新权限(当然这个方法可以修改获取更多参数等)
我使用 Spring 安全性 SwitchUserFilter
编写了功能。在应用程序中,我可以使用 /j_spring_security_switch_user?j_username=xxx
URL 切换用户并使用 /j_spring_security_exit_user
返回上一个。
我还实现了几种依赖于切换用户事实的方法,所以我想为它们编写单元测试。
因此我的问题是如何在 jUnit 测试环境中切换用户?
如果您想要集成测试,您应该考虑使用自定义 http 客户端,或者如果您的测试逻辑依赖于它,甚至是像 Selenium 这样的 GUI 驱动程序。
如果我们在谈论单元测试,请参考 Springs http://spring.io/blog/2014/05/07/preview-spring-security-test-method-security 文档,他们支持大量测试,@WithMockUser 注释似乎是您正在寻找的,它允许您指定应该使用哪个角色或用户运行此测试。
我编写了让用户准备 SwitchUserGrantedAuthority
并让他登录的方法。对于我的测试目的来说它似乎工作正常,但是任何提示和评论将不胜感激。
@SuppressWarnings({ "rawtypes", "unchecked" })
private User logAdminAsUser(User admin, String roleName) {
SecurityContextHolder.getContext().setAuthentication(
new TestingAuthenticationToken(admin, null, "ROLE_ADMIN"));
Authentication adminAuth = SecurityContextHolder.getContext().getAuthentication();
SwitchUserGrantedAuthority switchUserGrantedAuthority =
new SwitchUserGrantedAuthority("ROLE_ADMIN", adminAuth);
List authorities = new LinkedList();
authorities.add(switchUserGrantedAuthority);
User user = populator.storeUser("ROLE_USER");
SecurityContextHolder.getContext().setAuthentication(
new TestingAuthenticationToken(user, null, authorities));
return user;
}
我用过这个:
private void switchUser(User user, String roleName)
{
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Collection<GrantedAuthority> authorities =
new ArrayList<>();
GrantedAuthority ga = new SimpleGrantedAuthority(roleName);
authorities.add(ga);
Authentication result = new UsernamePasswordAuthenticationTokenExt(
user,
authentication.getCredentials(),
null,
System.currentTimeMillis()
);
SecurityContextHolder.getContext().setAuthentication( result );
}
其中User
是新用户,roleName
是要设置的新权限(当然这个方法可以修改获取更多参数等)