如何在用`@WebMvcTest`和`@WithMockUser`注释的测试中测试基于注释的特定于角色的安全性



我的问题是,我无法在测试中测试带注释的Rest端点的基于角色的身份验证。指定的角色似乎没有区别

我在REST控制器上使用基于注释的安全配置,如下所示:

@RestController
@RequestMapping("rest/person")
class PersonRestController(
private val securityService: SecurityService,
private val personService: PersonService,
) {
@GetMapping("/list")
@Secured(UserRole.Role.ROLE_COMPANY)
fun list(): List<Person> {
val companyId = securityService.currentUser.companyId
return personService.findByCompany(companyId)
}
}

在我的Web层测试中,我使用带有共享配置类的@WebMvcTest,该类提供了所有必需的bean(我们有一些共享的ExceptionHandlers和Interceptor,我想用我的控制器测试它们(

我的测试如下:

@WebMvcTest(PersonRestController::class)
@Import(RestControllerTestConfig::class)
class GroupedScheduleRestControllerTest {
@Autowired
private lateinit var mvc: MockMvc
@MockBean
private lateinit var personService: PersonService
// This bean is provided by RestControllerTestConfig
@Autowired
private lateinit var someSharedService: SomeSharedService

@Test
@WithMockUser(value = "user@company.at")
fun testReturnsEmptyList() {
val response = mvc.perform(MockMvcRequestBuilders.get("/rest/person/list"))
response.andExpect(status().isOk)
.andExpect(jsonPath("$.length()").value(0))
}
}

现在,我想添加一个单元测试,用于验证只有角色为COMPANY的用户才能访问该端点,但我无法使其工作。当我添加WithMockUser时,我的测试总是贯穿始终,与我为角色传递的内容无关。当我删除WithMockUser时,它总是以401 Unauthorized失败,所以似乎正在进行一些安全设置,但我的RestEndpoint中的@Secured似乎没有效果。

我是否缺少一些配置来通知@WebMvcTest从实例化的RestController中获取安全注释?

好的,为了获得@Secured注释,我将@EnableGlobalMethodSecurity(securedEnabled = true)添加到我的Configuration类中,它就像一个魅力🙈