mirror of
				https://github.com/spring-projects/spring-security.git
				synced 2025-11-04 08:39:05 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			62 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
=== SecurityMockMvcResultHandlers
 | 
						|
 | 
						|
Spring Security provides a few ``ResultHandler``s implementations.
 | 
						|
In order to use Spring Security's ``ResultHandler``s implementations ensure the following static import is used:
 | 
						|
 | 
						|
[source,java]
 | 
						|
----
 | 
						|
import static org.springframework.security.test.web.servlet.response.SecurityMockMvcResultHandlers.*;
 | 
						|
----
 | 
						|
 | 
						|
==== Exporting the SecurityContext
 | 
						|
 | 
						|
Often times we want to query a repository to see if some `MockMvc` request actually persisted in the database.
 | 
						|
In some cases our repository query uses the xref:features/integrations/data.adoc[Spring Data Integration] to filter the results based on current user's username or any other property.
 | 
						|
Let's see an example:
 | 
						|
 | 
						|
A repository interface:
 | 
						|
[source,java]
 | 
						|
----
 | 
						|
private interface MessageRepository extends JpaRepository<Message, Long> {
 | 
						|
	@Query("SELECT m.content FROM Message m WHERE m.sentBy = ?#{ principal?.name }")
 | 
						|
	List<String> findAllUserMessages();
 | 
						|
}
 | 
						|
----
 | 
						|
 | 
						|
Our test scenario:
 | 
						|
 | 
						|
[source,java]
 | 
						|
----
 | 
						|
mvc
 | 
						|
	.perform(post("/message")
 | 
						|
		.content("New Message")
 | 
						|
		.contentType(MediaType.TEXT_PLAIN)
 | 
						|
	)
 | 
						|
	.andExpect(status().isOk());
 | 
						|
 | 
						|
List<String> userMessages = messageRepository.findAllUserMessages();
 | 
						|
assertThat(userMessages).hasSize(1);
 | 
						|
----
 | 
						|
 | 
						|
This test won't pass because after our request finishes, the `SecurityContextHolder` will be cleared out by the filter chain.
 | 
						|
We can then export the `TestSecurityContextHolder` to our `SecurityContextHolder` and use it as we want:
 | 
						|
 | 
						|
[source,java]
 | 
						|
----
 | 
						|
mvc
 | 
						|
	.perform(post("/message")
 | 
						|
		.content("New Message")
 | 
						|
		.contentType(MediaType.TEXT_PLAIN)
 | 
						|
	)
 | 
						|
	.andDo(exportTestSecurityContext())
 | 
						|
	.andExpect(status().isOk());
 | 
						|
 | 
						|
List<String> userMessages = messageRepository.findAllUserMessages();
 | 
						|
assertThat(userMessages).hasSize(1);
 | 
						|
----
 | 
						|
 | 
						|
[NOTE]
 | 
						|
====
 | 
						|
Remember to clear the `SecurityContextHolder` between your tests, or it may leak amongst them
 | 
						|
====
 |