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

How to test annotation based role-specific security in test annotated with `@WebMvcTest` and `@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 与共享配置 class 一起使用,它提供了所有必需的 bean(我们有一些共享的异常处理程序和拦截器,我想用我的控制器进行测试)

我的测试是这样的:

@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) 添加到我的配置 class 并且它非常有效