我在测试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安全文档和在线文章,但没有一篇有效。
有人对此有想法吗?提前谢谢
1条答案
按热度按时间gywdnpxw1#
好吧,我知道发生了什么。
首先是
@Secured
对于被动应用程序(即springwebflux),Spring Security 似乎不处理注解。与@EnableReactiveMethodSecurity
你必须使用@PreAuthorize
注解。然后,我必须创建一个测试配置并将其导入到我的测试中,它就像一个魔咒一样工作。