如何在使用“@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 并且它非常有效
我的问题是我无法在测试中测试带注释的 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 并且它非常有效