##测试
- 基本引用,读取测试上下文
@Runwith(springJUnit4ClassRunner.class) @ContextConfiguration
- 去掉异常
@Test(expected=AuthenticationCredentialsNotFoundException.class)
- 使用模拟用户
@Test @WithMockUser
-
给模拟用户添加用户名 @Test @WithMockUser("customUsername")
-
给模拟用户添加角色 @Test @WithMockUser(username="admin",roles={"USER","ADMIN"})
-
给模拟用户添加授权 @Test @WithMockUser(username="admin",authorities={"ADMIN","USER"})
-
添加一个匿名对象.
@WithAnonymousUser 在方法上使用,使之获得一个匿名对象.
###使用@WithUserDetails
@WithMockUser适合初始学习,但是不会适合所有应用.它不适合那种指定了Authentication特定类型的主体.这样就可以指定任意的主体,并减少与spring security的耦合.
自定义当事人经常返回一个自定义的UserDetailsService,并返回实现了UserDetails和自定义类型的对象.这种情况下,它对于检测自定义的userDetailsService就非常有用.这个就是@WithUserDetails的工作.
假设UserDetailsService作为一个bean暴露.在下面的测试中UserDetailsService将暴露一个名为"user"的 UsernamepasswordAuthenticationToken类型的Authentication及其主体.
@Test @WithUserDetails public void getMessageWithUserDetails() { String message = messageService.getMessage(); ... }
我们也可以通过设置username来查找相应的principal.
@Test @WithUserDetails("customUsername")
另外,我们可以指定bean的名称 @Test @WithUserDetails(value="customUsername",userDetailsServiceBeanName="myUserDetailsService")
注: 这个注解要求其对应的用户必须存在
###@WithSecurityContext 我们可以通过@WithSecurityContext来创建我们需要的Security.例如,如下创建一个@WithMockCustomer
@Retention(RetentionPolicy.RUNTIME)
@WithSecurityContext(factory=WithMockCustomUserSecurityContextFactory.class)
public @interface WithMockCustomUser{
String username() default "rob";
String name() default "Rob Winch";
}
@WithMockCustomUser需要一个WithSecurityContextFacotry的实现类,是实现类代码如下:
public class withMockCustomerSecurityContextFactory implements WithSecurityContextFacotry<WithMockCustomUser>{
@Override
public SecurityContext createSecurityContext(WithMockCustomUser customUser){
SecurityContext context = SecurityContextHolder.createEmptyContext();
CustomUserDetails principal =
new CustomUserDetails(customUser.name(), customUser.username());
Authentication auth =
new UsernamePasswordAuthenticationToken(principal, "password", principal.getAuthorities());
context.setAuthentication(auth);
return context;
}
}
spring security的WithSecurityContextTestExecutionListener可以保证我们的操作正确运行.
在创建WithSecurityContextFactory 实现时,我们可以使用spring的标准注解.
###通过元注解来生成新的注解
我们可以利用@WithMockUser来生成新注解.
@Retention(RetentionPolicy.RUNTIME)
@WithMockUser(value="rob",roles="ADMIN")
public @interface WithMockAdmin{}