当前位置: 首页 > 知识库问答 >
问题:

如何使用Spring Security@Secured注释测试Spring Boot@WebFluxTest

尤茂材
2023-03-14

我在测试由Spring Security的@secured注释保护的Spring WebFlux控制器时遇到问题。这是我的控制器代码:

@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注释是一个自定义注释,它在安全上下文中使用提供的角色注入模拟身份验证对象。如果没有提供任何角色(如在第三个测试中),则默认为完全没有角色。

这里的问题是前两个测试工作正常,但是第三个测试失败,返回200 OK而不是403禁止。我的第一个想法是Spring Security不处理@Secure注释,所以我遵循了许多Spring WebFlux/Spring Security留档和在线文章,但都不起作用。

有人对此有想法吗?提前谢谢

共有1个答案

顾涵衍
2023-03-14

好吧,我知道发生了什么。

首先,@Secured注释似乎不是由Spring Security为被动应用程序(即Spring WebFlux)处理的。使用@enableeractivemethodsecurity时,必须使用@PreAuthorize注释。

然后,我必须创建一个测试配置并将其导入到我的测试中,它就像一个魔咒一样工作。

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

  // Same tests

}
 类似资料:
  • 我在我的SpringBoot应用程序“demo”中使用了注释样式的Resilience4j。当通过RestTemplate调用外部后端时,我希望使用TimeLimiter并重试以实现以下目标: 将REST调用持续时间限制在5秒-->如果需要更长时间,则使用TimeoutException失败 在TimeoutException上重试-->最多尝试2次 为了查看弹性设置的配置是否如设计的那样工作,我

  • 我想配置一个Spring Boot应用程序,以便根本不使用DB。因此,我对应用程序类进行了注释,以排除JPA自动配置类: 原因:org.springframework.beans.factory.BeanCreationException:创建名为“data source”的bean时出错:调用init方法失败;嵌套异常是java.lang.IllegalStateException:无法为测试确

  • 我需要测试验证注释,但看起来它们不起作用。我不确定JUnit是否也是正确的。目前,测试将通过,但您可以看到指定的电子邮件地址是错误的。 JUnit 待测试类别

  • 我有一个生成屏幕截图的类: 我的应用程序是用创建的,我需要对它进行测试。但我得到 我的测试: 我试图防止无头异常: 我使用的是spring启动版本1.5.6。 但这无济于事。我得到日志: java.awt.HeadlessException在sun.awt.HeadlesStoolKit.GetScreenSize(headlesStoolKit.java:284)在org.robinhood.i

  • 我正在寻找一种有效地针对JUnit5集成测试的方法。测试使用gradle运行,所有集成测试类都由自定义类级别注释修饰。我可以根据它们的类名模式或通过使用标记对它们进行分类来筛选它们,但是有没有一种方法可以设置一个针对带有注释的测试的测试套件呢?

  • 我正在学习SpringBoot,在参考文档中有一个例子,我有一个问题。文件的以下部分提到 6.使用@SpringBootApplication注释 可以使用单个@SpringBootApplication注释来启用这三个功能,即: @EnableAutoConfiguration:启用Spring Boot的自动配置机制 @ComponentScan:在应用程序所在的包上启用@Component扫