pyb*_*pyb 3 testing cookies spring-mvc spring-security
我有一个受HTTP Basic身份验证保护的控制器。
我将应用程序设置为使用会话cookie,并且可以正常工作。
但是,当我使用MockMvc测试控制器时,成功的身份验证不会给我任何cookie。
网页配置:
package world.pyb.spring.cookiesdemo;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.servlet.configuration.EnableWebMvcSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
@Configuration
@EnableWebMvcSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("admin").password("argentina").roles("USER");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
//@formatter:off
http.httpBasic()
.and().authorizeRequests().antMatchers(HttpMethod.GET, "/hello").authenticated()
.and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.ALWAYS);
//@formatter:on
}
}
Run Code Online (Sandbox Code Playgroud)
简单的控制器:
package world.pyb.spring.cookiesdemo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@RequestMapping("/hello")
public String index() {
return "Greetings from Spring Boot!";
}
}
Run Code Online (Sandbox Code Playgroud)
不给我会话cookie的简单控制器测试:
package world.pyb.spring.cookiesdemo;
import static org.hamcrest.Matchers.equalTo;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.cookie;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class HelloControllerTest {
@Autowired
private MockMvc mvc;
@Test
public void getHello() throws Exception {
mvc.perform(MockMvcRequestBuilders.get("/hello")
.with(SecurityMockMvcRequestPostProcessors.httpBasic("admin", "argentina"))
)
// prints "Cookies = []"
.andDo(MockMvcResultHandlers.print())
.andExpect(cookie().exists("JSESSIONID"))
.andExpect(status().is2xxSuccessful())
.andExpect(content().string(equalTo("Greetings from Spring Boot!")));
}
}
Run Code Online (Sandbox Code Playgroud)
相关问题:
一些答案建议不要使用MockMvc,但如果可能的话,我想继续使用它。
如问题代码所示,MockMvcResultMatcher包括对cookie的支持。
只要被测控制器本身提供cookie,它就可以正常工作。这里的问题是cookie是由Spring Security交付的,Spring Security是控制器的包装器。MockMvc正在直接测试您的控制器,而不是测试在其真实HTTP服务器中运行的控制器,这是测试安全层cookie所需的。
这就是为什么TestRestTemplate,它在完整的服务器上下文中调用您的控制器,提供了更全面的测试环境。
但是请注意,从Spring 5开始,用于运行服务器API的较新方法基于WebTestClient。
| 归档时间: |
|
| 查看次数: |
2649 次 |
| 最近记录: |