spring security测试相关
spring security测试相关
流光韶逝 发表于11个月前
spring security测试相关
  • 发表于 11个月前
  • 阅读 22
  • 收藏 0
  • 点赞 0
  • 评论 0

【腾讯云】新注册用户域名抢购1元起>>>   

摘要: spring security测试相关

##测试

  • 基本引用,读取测试上下文

@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{}
标签: spring-security test
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 19
博文 90
码字总数 126606
×
流光韶逝
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: