Spring Security OAuth和Cucumber访问被拒绝

时间:2018-10-11 14:34:14

标签: spring spring-security cucumber spring-security-oauth2

我整天阅读了有关如何将Spring Security OAuth与Cucumber连接的文章,但是没有一个与我的用例匹配,我只是看到人们有相同的问题:

目标是能够从黄瓜方案中访问“受限制的” API端点,并且不会由于@PreAuthorize方法拒绝访问而引起烦人的401错误。这与使用MockMvc的@WebMvcTest测试非常相似,您可以在其中轻松注入安全过滤器链,并且它甚至不关心是否在OAuth中或不在后台,因为过滤器链不是真正的。

因此,对于黄瓜,我希望能够进行一个带有注释的简单测试

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) 

可以使用类似@WebMvcTest的@WithMockUser(...)的方法,但这显然不起作用,因为在OAuth安全过滤器链中,应该使用真正的jwt令牌,并且我在API端点上进行操作(因此是某种黑匣子):

所以我现在可以发布各种代码,但是我向您保证,安全配置实际上是SpringSecurity配置的基本设置,如下所示,尝试在黄瓜方案中进行身份验证:

@Override
public void configure(HttpSecurity http) throws Exception {
    http
        .csrf().disable()
        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .sessionAuthenticationStrategy(sessionAuthenticationStrategy())
        .and()
        .exceptionHandling().authenticationEntryPoint((req, rsp, e) -> rsp.sendError(HttpServletResponse.SC_UNAUTHORIZED, e.getMessage()))
        .and()
        .authorizeRequests()
            .antMatchers("/**").authenticated();
}

我考虑过以下解决方案,但都不是真正的解决方案或有效的解决方案:

  • 在黄瓜测试环境中禁用安全性:401将会消失,但是我无法测试任何ACL,所以这真的不是我想要的
  • 尝试@WithMockUser,就像在MockMvc中一样:不起作用
  • 试图在测试中创建一个伪造的jwt并将其添加到伪装客户端中:假冒OAuth2AuthenticationDetails在拦截器中是一团糟
  • 尝试在步骤定义中设置“ SecurityContextHolder.getContext()。setAuthentication(authentication)”:嗯,这在安全过滤器链中失败,并且如果我直接调用基础服务也将失败。

所以也许有人在那里知道有关如何使用Spring Security OAuth对黄瓜中的场景进行身份验证这一非常普遍的问题的解决方案,假设那里没有真正的授权服务器可以与之交谈没有端到端测试。因此,我想我必须采用创建“测试JWT”并将其附加到假客户端请求的方法,但是该怎么做呢?生成不是问题,但是,如果这是首选方法,那么如何正确附加它?

当我从控制器内部删除@PreAuthorize批注时,将“ .antMatchers(” / “)。authenticated()”更改为“ .antMatchers(” / “))。 ()”,那么它正在工作。 ..

0 个答案:

没有答案