Spring Boot - @PreAuthorize 在测试中不起作用

Bor*_*ris 5 java spring spring-mvc spring-security

我有这样的控制器

@RestController
@RequestMapping(value="/test")
@PreAuthorize("hasRole('ADMIN')")
public class TestController
{

    @RequestMapping( method=RequestMethod.GET, produces=MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<String> test ()
    {

        return ResponseEntity.ok("test");
    }

}
Run Code Online (Sandbox Code Playgroud)

我尝试编写单元测试来测试访问此控制器方法的权限。

这是我的测试

@RunWith(SpringRunner.class)
@ContextConfiguration
 @WebMvcTest(value = TestController.class)
public class AUnitTest
{

    @Autowired
    private MockMvc mockMvc;

    private final String url = "/test";

    @Test
    @WithMockUser(roles="ADMIN")
    public void testAdminUser() throws Exception
    {
        RequestBuilder requestBuilder = MockMvcRequestBuilders.get(this.url );
        MvcResult result = mockMvc.perform(requestBuilder).andReturn();
        assertEquals(HttpStatus.OK.value(), result.getResponse().getStatus());
    }

}
Run Code Online (Sandbox Code Playgroud)

当我从 @WithMockUser 中删除角色并留空时,默认情况下它将具有角色 USER 然后测试通过。当我放置角色 USER 和 ADMIN 时,它也会因为 USER 角色而通过。但是,每当我将角色设置为 ADMIN 时,它都会失败,即使我将该用户设置为需要具有 ADMIN 角色才能访问控制器。

我尝试设置用户名、密码、Spring Security Docs 中的所有内容等。

我错过了什么吗?

mys*_*eim 5

尝试添加@EnableGlobalMethodSecurity(prePostEnabled = true)到测试类。

或者像这样添加配置:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
static class Config {
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 我进行了广泛的搜索,这是唯一有效的解决方案!谢谢你!如果直接使用@EnableGlobalMethodSecurity(prePostEnabled = true),它将调用Spring的权限评估器。相反,您需要添加扩展 GlobalMethodSecurityConfiguration 的配置类,并将您的自定义权限评估器实现添加到测试的 ContextConfiguration 注释中。否则,Spring 将拒绝所有请求。 (2认同)