安全上

我刚刚宣布了新消息学习春天安全课程,包括完整的材料集中在新的OAuth2堆栈在Spring Security 5:

>>查看课程

1.介绍

在不需要独立集成环境的情况下执行集成测试的能力对于任何软件堆栈都是很有价值的特性。Spring Boot与Spring Security的无缝集成使得测试与安全层交互的组件变得很简单。

在这个快速教程中,我们将探索使用@MockMvcTest@springboottest.执行启用安全性的集成测试。

2.依赖关系

让我们首先带来我们的依赖关系:

<依赖项>  org.springframework.boot   Spring-Boot-Starter-Security   <依赖项>  org.sprodframe.boot   Spring-Boot-Starter-Web   <依赖项>  org.springframework.boot   Spring-Boot-Starter-Test   Test   <依赖项>  org.springframework.security  春天安全测试 <范围>测试 

spring-boot-starter-web,spring-boot-starter-security,spring-boot-starter-test启动器为我们提供了对Spring MVC、Spring Security和Spring Boot测试工具的访问。

另外,我们会带来spring-security-test才能进入@WithMockUser我们将要使用的注释。

3.网络安全配置

我们的web安全配置将非常简单。只有经过身份验证的用户才能访问匹配的路径/私人/ * *。相匹配的路径/上市/**将为任何用户提供:

@Configuration公共类WebSeecurityConfigurer扩展了WebSecurityConfigurerAdapter {@Override保护void配置(AuthenticationManagerBuilder Auth)抛出异常{PasswordEncoder eNcoder = passwordencoderFactories.CreatedElegatedPassWordEnder();auth.inmemoryauthentication().passwordencoder(编码器)。散文(“spring”).password(encoder.encode(“秘密”)).oroles(“用户”);@Override受保护的void配置(Httpsecurity HTTP)抛出异常{http.authorizeRequests().antmatchers(“/ private / **”).Authenticated().Artmatchers(“/ public / **”).permitall().and().httpbasic();}}

4.安全配置方法

除了基于URL路径的安全性外,我们在WebSeecurityConfigurer,我们可以通过提供其他配置文件来配置基于方法的安全性:

@Configuration @ enableglobalmethodsecurityconfiguration (prePostEnabled = true) public class MethodSecurityConfigurer extends GlobalMethodSecurityConfiguration {}

此配置支持Spring Security的前/后注释。如果需要额外的支持,还可以使用其他属性。有关Spring方法安全性的更多信息,请查看我们的关于这个话题的文章

5.测试控制器@WebMvcTest

使用时@WebMvcTestSpring Security的注释方法,MockMvc是否自动配置了必要的过滤器链需要测试我们的安全配置。

因为MockMvc配置为我们,我们可以使用@WithMockUser对于我们的测试,没有任何其他配置:

@RunWith(SpringRunner.class) @WebMvcTest(SecuredController.class) public class SecuredControllerWebMvcIntegrationTest {@Autowired private MockMvc mvc;/ /……其他方法@WithMockUser(value = "spring") @Test public void givenAuthRequestOnPrivateService_shouldSucceedWith200() throws Exception {mvc.perform(get("/private/hello").contentType(mediattype . application_json)) .andExpect(status().isOk());}}

注意,使用@WebMvcTest将告诉Spring Boot只实例化web层,而不是整个上下文。由于这个原因,控制器测试使用@WebMvcTest将比其他方法更快地运行

6.测试控制器@springboottest.

使用时@springboottest.用春天安全测试控制器的注释,在设置时,有必要显式地配置过滤器链MockMvc

使用静态springSecurity提供的方法SecurityMockMvcConfigurer是这样做的首选方法:

@RunWith(springruner .class) @SpringBootTest(webEnvironment = webEnvironment . random_port) public class SecuredControllerSpringBootIntegrationTest {@Autowired private WebApplicationContext context;私人MockMvc mvc;@Before public void setup() {mvc = MockMvcBuilders .webAppContextSetup(context) .apply(springSecurity()) .build();} / /……其他方法@WithMockUser(“spring”)@Test public void givenAuthRequestOnPrivateService_shouldSucceedWith200() throws Exception {mvc.perform(get(“/private/hello”).contentType(mediattype . application_json)) .andExpect(status().isOk());}}

7.用以下方法测试安全方法@springboottest.

@springboottest.不需要任何额外的配置来测试安全的方法。我们可以直接调用方法并使用即可@WithMockUser根据需要:

@SpringBootTest public class SecuredMethodSpringBootIntegrationTest {@Autowired private SecuredService service;@Test(expected = AuthenticationCredentialsNotFoundException.class) public void givenUnauthenticated_whenCallService_thenThrowsException() {service.sayHelloSecured();} @WithMockUser(username="spring") @Test public void givenAuthenticated_whenCallServiceWithSecured_thenOk() {assertThat(service.sayHelloSecured()).isNotBlank();}}

8.测试@springboottest.testresttemplate.

testresttemplate.是为安全REST端点编写集成测试时的一个方便选择。

我们可以简单地自动装配一个模板,并在请求安全端点之前设置凭据:

@runwith(springrunner.class)@springboottest(webenvironment = webenvironment.random_port)public类securedcontrollerresttemplateIntegrationtest {@autowired私有测试resttemplate模板;//其他方法@Test public void gentauteurequestonprivateservice_shouldsucceedwith200()抛出异常{analessentity 结果= template.withbasicauth(“spring”,“secret”).geturentity(“/ private / hello”,string.class);assertequals(httpstatus.ok,结果.getstatuscode());}}

testresttemplate.是灵活的,提供许多有用的安全相关选项。有关更多细节testresttemplate.,看看我们的关于这个话题的文章

9.结论

在本文中,我们查看了几种执行安全的集成测试的方法。

我们了解了如何使用mvccontroller和REST端点,以及如何使用安全方法。

通常,这里的示例的所有源代码都可以是在GitHub上找到的

安全底部

我刚刚宣布了新消息学习春天安全课程,包括完整的材料集中在新的OAuth2堆栈在Spring Security 5:

>>查看课程
2注释
最老的
最新
内联反馈
查看所有评论
评论在本文上关闭!