如何在带有注释@PreAuthorize(“ hasRole('ADMIN')”)的安全方法的控制器上进行春季云合同测试?

时间:2019-07-11 12:21:48

标签: spring-mvc spring-security spring-cloud-contract

我正在MVC Controller上编写Spring Cloud Contract测试,其中的方法带有注释@PreAuthorize("hasRole('ADMIN')")。为了通过方法的安全性,我需要提供什么? 我需要测试控制器的安全性。 在项目中使用的Oauth2安全性。 我是初级开发人员(许多我还不知道的事情),如果您提供给我扩展的答案,那就太好了。 谢谢。

我创建了基础测试类,该类在setup()方法中提供了带有注释@Before的mockMvc。

基础测试类具有外观形式:

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = AdminController.class)
@ContextConfiguration(classes = {AdminControllerTestConfig.class, TestConfig.class, AdminControllerTestProperty.class})
@ComponentScan(basePackageClasses = AdminController.class)
@TestPropertySource(locations = "/AdminControllerTest.properties")
@AutoConfigureStubRunner(workOffline = true)
public class AdminControllerContractBaseTest {
    //code
}

自动生成合同测试的设置方法

@Before
    public void setup() {
        Admin admin = createAdminUser();
        when(adminRepository.findOneByCredentialsId(id)).thenReturn(admin);
        RestAssuredMockMvc.standaloneSetup(new AdminController(adminService, credentialsService));
        MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(context)
                .apply(springSecurity())
                .build();
    }

用于自动生成的测试类的测试方法

    @Test
    public void shouldFindAdminUserById() {
    }

    @Test
    public void shouldNotFindAdminUserById() {
    }

    @Test
    public void userDoesNotLoggedIn() {
    }

我知道,出于安全性考虑,我没有提供有关登录用户的任何详细信息,但是在合同测试的情况下,我找不到有关如何执行此操作的信息。

我尝试在测试方法上设置注释@WithMockUser(roles = "ADMIN"),但是它不起作用。

也许我没有足够的配置来通过测试? 顺便说一句,我有访问此API的用户的电子邮件和密码。

在根据合同规定的以下方法的自动生成的测试中

ResponseOptions response = given().spec(request)                     
    .get("/api/admin/a") 

通过测试后,我期望响应代码为200,但实际代码为401

1 个答案:

答案 0 :(得分:0)

您可能想用@SpringBootTest编写集成测试,而不是使用Spring Cloud Contract来测试您的安全性。 已创建Spring Cloud Contract,以验证您的通信层的输入和输出,并让您(生产者)知道您是否要破坏API,以便其他人(消费者)使用公开的API有问题。< / p>

请查看此barplot,了解如何在不启动整个应用程序上下文的情况下设置Spring Cloud Contract测试。

希望有帮助! :)