Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring security springoauth和Boot集成测试_Spring Security_Spring Boot_Spring Test_Spring Security Oauth2 - Fatal编程技术网

Spring security springoauth和Boot集成测试

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

对OAuth资源服务器配置的web应用程序运行Spring引导集成测试的最佳方法是什么

我可以想到两种理论方法:

  • 模拟资源服务器中的安全上下文,而不实际调用授权服务器
  • 作为测试的一部分嵌入授权服务器,并将身份验证重定向到该服务器

  • 我想知道其他人是如何处理这个问题的

    我使用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'
    。然后在该方法中,我检索这个mock
    SecurityContext
    ,并将其附加到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