Spring security springoauth和Boot集成测试
对OAuth资源服务器配置的web应用程序运行Spring引导集成测试的最佳方法是什么 我可以想到两种理论方法:Spring security springoauth和Boot集成测试,spring-security,spring-boot,spring-test,spring-security-oauth2,Spring Security,Spring Boot,Spring Test,Spring Security Oauth2,对OAuth资源服务器配置的web应用程序运行Spring引导集成测试的最佳方法是什么 我可以想到两种理论方法: 模拟资源服务器中的安全上下文,而不实际调用授权服务器 作为测试的一部分嵌入授权服务器,并将身份验证重定向到该服务器 我想知道其他人是如何处理这个问题的 我使用SpringSecurity4.x@和SecurityContext('user')注释创建登录了'user'的模拟SecurityContext。然后,当使用MockMvc调用我的restapi时,我检索SecurityCon
我想知道其他人是如何处理这个问题的 我使用SpringSecurity4.x
@和SecurityContext('user')
注释创建登录了'user'
的模拟SecurityContext
。然后,当使用MockMvc
调用我的restapi时,我检索SecurityContext
并将其附加到调用中
像这样:
@测试
@交易的
@使用安全上下文(“用户”)
public void getAllParcels()引发异常{
//初始化数据库
long size=parcelRepository.count();
parcelRepository.saveAndFlush(包裹);
//拿到所有的包裹
restParcelMockMvc.perform(get(“/api/parcels”).with(security())
.andExpect(状态().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andExpect(jsonPath(“$.[”+size+“].id”).value(parcel.getId())
.andExpect(jsonPath(“$.[”+大小+“].lot”).value(默认批次))
.andExpect(jsonPath(“$.[”+大小+“].localName”).value(默认值为本地名称));
}
其中security()
是静态方法:
publicstaticrequestpostprocessorsecurity(){
返回SecurityMockMvcRequestPostProcessors.securityContext(SecurityContextHolder.getContext());
}
因此,为我的测试方法创建了将@与SecurityContext(“用户”)一起使用
模拟SecurityContext
与登录名为的身份验证用户一起使用@user'
。然后在该方法中,我检索这个mockSecurityContext
,并将其附加到RESTAPI调用中,以使我的oAuth认为用户已通过身份验证。这基本上是你在问题中提出的第一种方法
要使其工作,必须将OAuth切换为测试的状态完整。否则就不行了
例如:
@配置
公共类OAuth2Server配置{
@配置
@EnableResourceServer
受保护的静态类ResourceServerConfiguration扩展了ResourceServerConfigurerAdapter{
@自动连线(必需=错误)
@限定符(“oauth2StatelessSecurityContext”)
private Boolean stateless=Boolean.TRUE;//测试的有状态切换!
@注入
私有HTTP401授权登录点认证登录点;
@注入
私有AjaxLogoutSuccessHandler AjaxLogoutSuccessHandler;
@凌驾
public void configure(HttpSecurity http)引发异常{
http
.例外处理()
.authenticationEntryPoint(authenticationEntryPoint)
.及()
.logout()
.logoutUrl(“/api/logout”)
.logoutSuccessHandler(ajaxLogoutSuccessHandler)
.及()
.csrf()
.requireCsrfProtectionMatcher(新的AntPathRequestMatcher(“/oauth/authorize”))
.disable()
.headers()
.frameOptions().disable()和()
.会议管理()
.sessionCreationPolicy(sessionCreationPolicy.STATELESS)
.及()
.授权请求()
.antMatchers(“/api/authenticate”).permitAll()
.antMatchers(“/api/register”).permitAll()
.antMatchers(“/api/logs/**”).hasAnyAuthority(AuthoritiesConstants.ADMIN)
.antMatchers(“/api/**”).authenticated()
.antMatchers(“/metrics/**”).hasAuthority(AuthoritiesConstants.ADMIN)
.antMatchers(“/health/**”).hasAuthority(AuthoritiesConstants.ADMIN)
.antMatchers(“/trace/**”).hasAuthority(AuthoritiesConstants.ADMIN)
.antMatchers(“/dump/**”).hasAuthority(AuthoritiesConstants.ADMIN)
.antMatchers(“/shutdown/**”).hasAuthority(AuthoritiesConstants.ADMIN)
.antMatchers(“/beans/**”).hasAuthority(AuthoritiesConstants.ADMIN)
.antMatchers(“/configprops/**”).hasAuthority(AuthoritiesConstants.ADMIN)
.antMatchers(“/info/**”).hasAuthority(AuthoritiesConstants.ADMIN)
.antMatchers(“/autoconfig/**”).hasAuthority(AuthoritiesConstants.ADMIN)
.antMatchers(“/env/**”).hasAuthority(AuthoritiesConstants.ADMIN)
.antMatchers(“/trace/**”).hasAuthority(AuthoritiesConstants.ADMIN)
.antMatchers(“/api docs/**”).hasAuthority(AuthoritiesConstants.ADMIN)
.antMatchers(“/protected/**”).authenticated();
}
@凌驾
public void configure(ResourceServerSecurityConfigure资源)引发异常{
资源。无状态(无状态);
超级配置(资源);
}
}
...
您可以看到我的statelessesecuritycontext
属性,它只在测试中被注入。在正常运行中,它使用它的默认值true
(因此它是无状态的)。对于测试,我使用值false
声明OAuth2StatelessesecurityContext
Bean,以便它在测试中变为statefull
我为测试定义此配置:
@配置
公共类OAuth2Statefull{
@豆子
@初级的
公共布尔值oauth2StatelessSecurityContext(){
返回Boolean.FALSE;
}
}
我就是这样做的。我希望我的解释是可以理解的。这个答案与Ondrej提供的答案非常相似,但要简单一些
Spring Security 4提供测试支持。要使用它,请确保您拥有Spring-Security-Test-4.0.2.RELEASE.jar(或类路径上的更新版本)。您还需要确保使用Spring tes