2014-10-01 21 views
11

REST API'mda oturum açma ve güvenliği test etmeye çalışıyorum, bu yüzden gerçek yaşamdaki istek sıralarını mümkün olduğunca yaklaştırmaya çalışıyorum.Spring MockMvc sonucu neden bir çerez içermiyor?

Benim ilk isteği olacaktır:

this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac). 
    addFilters(springSecurityFilterChain).build(); 
this.mapper = new ObjectMapper(); 
.... 
MvcResult result=mockMvc.perform(get("/login/csrf")).andExpect(status().is(200)).andReturn(); 
Cookie[] cookies = result.getResponse().getCookies(); 

(pastebin tam sınıfına bakın).

Daha sonra alınan CSRF belirteci ile oturum açmak için çerez almak için deneyin, ancak cookies dizisi boş! Benim uygulamayı çalıştırmak ve ararsanız

Ancak

curl -i http://localhost:8080/login/csrf 

Ben Set-Cookie başlığı döneriz ve bu çerez (ve CSRF belirteci) kullanabilir sonradan kimliğini doğrulamak için.

Soru şu ki: MockMvc bana bir çerez döndürmek için nasıl alabilirim?

session=(MockHttpSession)result.getRequest().getSession(); 

Ve sonra doğrudan oturumu takmadan:

req.session(session); 

Memnun değilim nedenini

+1

Nasıl mı ayarladığınızda 'mockMvc'? –

+0

@SotiriosDelimanolis Bunu gösterecek şekilde kodumu düzenledim. Zaman aldığımda, test sınıfının ilgili bitlerini buraya veya bir macun kovasına koyacağım. –

+0

Test sınıfımın ilgili bölümleri pastebin'tir: http://pastebin.com/LiNeRFT0 –

cevap

9

doğrudan MockHttpServletRequest gelen oturum nesneleri ayıklamak için yeteneğini kullanarak, geçici bir çözüm bulduk Bu çözümle, sahte httpservlet'in bu bağlamda gerçek sunucudan farklı davranması durumunda, diğer durumlarda gerçek sunucu ile aynı davranışın olup olmadığından nasıl emin olabilirim. Bu yüzden, testin kendisinde potansiyel olarak boşluk bırakan uygulamayı test etmiyorum.

0

Çerezlerle test için RestTemplate ile çalışıyorum. RestTemplate cookies handler

@RunWith(SpringRunner.class) 
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) 
@Import(RestTemplateWithCookies.class) 
public class ApplicationTest { 

    @LocalServerPort 
    private int port; 

    @Autowired 
    private Environment env; 

    @Autowired 
    private RestTemplateWithCookies restTemplate; 

    @Test 
    public void appTest() throws Exception { 
     HttpHeaders headers = new HttpHeaders(); 
     headers.set("Referer", env.getProperty("allowed_referer")); 
     HttpEntity<String> entity = new HttpEntity<String>("parameters", headers); 
     ResponseEntity<String> response = restTemplate.exchange("http://localhost:" + port + "/[email protected]", HttpMethod.GET, entity, String.class); 
     assertTrue(response.getStatusCode() == HttpStatus.FOUND); 
     HttpCookie c = restTemplate.getCoookies().stream().filter(x -> env.getProperty("server.session.cookie.name").equals(x.getName())).findAny().orElse(null); 
     assertTrue(c != null); 

    } 

} 
0

P.Péter cevabı dayanarak almak ve mockMvc üzerinde gerçekleştirilen her istek (MockHttpServletRequestBuilder) için otomatik olarak oturumu geri koyacağız bu kod parçası yapılmış bir. Uzun bir yanıt için

@Autowired 
private WebApplicationContext webApplicationContext; 

@Autowired 
private Filter springSecurityFilterChain; 

@Before 
public void setUp() throws Exception { 
    final MockHttpServletRequestBuilder defaultRequestBuilder = get("/dummy-path"); 
    this.mockMvc = MockMvcBuilders.webAppContextSetup(this.webApplicationContext) 
      .defaultRequest(defaultRequestBuilder) 
      .alwaysDo(result -> setSessionBackOnRequestBuilder(defaultRequestBuilder, result.getRequest())) 
      .apply(springSecurity(springSecurityFilterChain)) 
      .build(); 
} 

private MockHttpServletRequest setSessionBackOnRequestBuilder(final MockHttpServletRequestBuilder requestBuilder, 
                  final MockHttpServletRequest request) { 
    requestBuilder.session((MockHttpSession) request.getSession()); 
    return request; 
} 

: onay bu çözüm (cevap ilkbahar 4 içindir): How to login a user with spring 3.2 new mvc testing

İlgili konular