如何使用spring security@secured注解测试spring boot@webfluxtest

t5fffqht  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(481)

我在测试SpringWebFlux控制器时遇到问题,该控制器由SpringSecurity的 @Secured 注解。这是我的控制器代码:

@RestController
@RequestMapping("/endpoint")
public class MyController {

    @GetMapping()
    @Secured("ADMIN")
    public Flux<MyOutputDto> getOutputDtos() {
        return myService.getOutputDtos();
    }
}

这是我的测试代码:

@WebFluxTest(MyController.class)
class MyControllerTest {

    @Autowired
    WebTestClient webTestClient;

    @Test
    @WithApplicationUser(roles = "ADMIN")
    void should_work_fine() {
        webTestClient.get()
                .uri("/endpoint")
                .exchange()
                .expectStatus().isOk();
    }

    @Test
    void should_return_401_unauthorized() {
        webTestClient.get()
                .uri("/endpoint")
                .exchange()
                .expectStatus().isUnauthorized();
    }

    @Test
    @WithApplicationUser
    void should_return_403_forbidden() {
        webTestClient.get()
                .uri("/endpoint")
                .exchange()
                .expectStatus().isForbidden();
    }
}

这个 @WithApplicationUser 注解是一种自定义注解,它在安全上下文中使用提供的角色注入模拟身份验证对象。如果没有提供角色(如在第三个测试中),那么它默认为完全没有角色。
这里的问题是,前两个测试工作正常,但第三个测试失败,返回200ok而不是403 forbidden。我的第一个想法是 Spring 安全,而不是处理 @Secured 注解,所以我关注了许多springwebflux/spring安全文档和在线文章,但没有一篇有效。
有人对此有想法吗?提前谢谢

gywdnpxw

gywdnpxw1#

好吧,我知道发生了什么。
首先是 @Secured 对于被动应用程序(即springwebflux),Spring Security 似乎不处理注解。与 @EnableReactiveMethodSecurity 你必须使用 @PreAuthorize 注解。
然后,我必须创建一个测试配置并将其导入到我的测试中,它就像一个魔咒一样工作。

@TestConfiguration
@EnableReactiveMethodSecurity
public class WebFluxControllerSecurityTestConfig {
}
@WebFluxTest(MyController.class)
@Import(WebFluxControllerSecurityTestConfig.class)
class MyControllerTest {

  // Same tests

}

相关问题