Spring Boot - @PreAuthorize在测试

时间:2017-07-26 09:23:17

标签: 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");
    }

}

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

这是我的测试

@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());
    }

}

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

我尝试设置用户名,密码,Spring Security Docs等所有内容

我错过了什么吗?

1 个答案:

答案 0 :(得分:3)

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

或者像这样添加配置:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
static class Config {
    ...
}