SpringSecurity: testing basic authentication
- add autentication chain rule - create test user - add auth data to test requests
This commit is contained in:
		
							parent
							
								
									7963542c9b
								
							
						
					
					
						commit
						30aff2259e
					
				@ -16,6 +16,13 @@ public class SecurityConfig {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @Bean
 | 
					    @Bean
 | 
				
			||||||
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
 | 
					    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
 | 
				
			||||||
 | 
					        http.authorizeHttpRequests()
 | 
				
			||||||
 | 
					            .requestMatchers("/cashcards/**")
 | 
				
			||||||
 | 
					            .authenticated()
 | 
				
			||||||
 | 
					            .and()
 | 
				
			||||||
 | 
					            .csrf().disable()
 | 
				
			||||||
 | 
					            .httpBasic();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return http.build();
 | 
					        return http.build();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -23,4 +30,15 @@ public class SecurityConfig {
 | 
				
			|||||||
    public PasswordEncoder passwordEncoder() {
 | 
					    public PasswordEncoder passwordEncoder() {
 | 
				
			||||||
        return new BCryptPasswordEncoder();
 | 
					        return new BCryptPasswordEncoder();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Bean
 | 
				
			||||||
 | 
					    public UserDetailsService testOnlyUsers(PasswordEncoder passwordEncoder) {
 | 
				
			||||||
 | 
					        User.UserBuilder users = User.builder();
 | 
				
			||||||
 | 
					        UserDetails sarah = users
 | 
				
			||||||
 | 
					            .username("sarah1")
 | 
				
			||||||
 | 
					            .password(passwordEncoder.encode("abc123"))
 | 
				
			||||||
 | 
					            .roles() // No roles for now
 | 
				
			||||||
 | 
					            .build();
 | 
				
			||||||
 | 
					    return new InMemoryUserDetailsManager(sarah);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -31,7 +31,9 @@ class CashcardApplicationTests {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @Test
 | 
					    @Test
 | 
				
			||||||
    void shouldReturnACashCardWhenDataIsSaved() {
 | 
					    void shouldReturnACashCardWhenDataIsSaved() {
 | 
				
			||||||
        ResponseEntity<String> response = restTemplate.getForEntity("/cashcards/99", String.class);
 | 
					        ResponseEntity<String> response = restTemplate
 | 
				
			||||||
 | 
								.withBasicAuth("sarah1", "abc123")
 | 
				
			||||||
 | 
								.getForEntity("/cashcards/99", String.class);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
 | 
					        assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -46,7 +48,9 @@ class CashcardApplicationTests {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	@Test
 | 
						@Test
 | 
				
			||||||
	void shouldNotReturnACashCardWithAnUnknownId() {
 | 
						void shouldNotReturnACashCardWithAnUnknownId() {
 | 
				
			||||||
		ResponseEntity<String> response = restTemplate.getForEntity("/cashcards/1000", String.class);
 | 
							ResponseEntity<String> response = restTemplate
 | 
				
			||||||
 | 
								.withBasicAuth("sarah1", "abc123")
 | 
				
			||||||
 | 
								.getForEntity("/cashcards/1000", String.class);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  		assertThat(response.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND);
 | 
					  		assertThat(response.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND);
 | 
				
			||||||
		assertThat(response.getBody()).isBlank();
 | 
							assertThat(response.getBody()).isBlank();
 | 
				
			||||||
@ -56,15 +60,20 @@ class CashcardApplicationTests {
 | 
				
			|||||||
	@DirtiesContext
 | 
						@DirtiesContext
 | 
				
			||||||
	void shouldCreateANewCashCard() {
 | 
						void shouldCreateANewCashCard() {
 | 
				
			||||||
		CashCard newCashCard = new CashCard(null, 250.00, "sarah1");
 | 
							CashCard newCashCard = new CashCard(null, 250.00, "sarah1");
 | 
				
			||||||
		ResponseEntity<Void> createResponse = restTemplate.postForEntity("/cashcards", newCashCard, Void.class );
 | 
							ResponseEntity<Void> createResponse = restTemplate
 | 
				
			||||||
 | 
								.withBasicAuth("sarah1", "abc123")
 | 
				
			||||||
 | 
								.postForEntity("/cashcards", newCashCard, Void.class );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		assertThat(createResponse.getStatusCode()).isEqualTo(HttpStatus.CREATED);
 | 
							assertThat(createResponse.getStatusCode()).isEqualTo(HttpStatus.CREATED);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Validate created CashCard
 | 
				
			||||||
		URI locationOfNewCashCard = createResponse.getHeaders().getLocation();
 | 
							URI locationOfNewCashCard = createResponse.getHeaders().getLocation();
 | 
				
			||||||
   		ResponseEntity<String> getResponse = restTemplate.getForEntity(locationOfNewCashCard, String.class);
 | 
					   		ResponseEntity<String> getResponse = restTemplate
 | 
				
			||||||
 | 
								.withBasicAuth("sarah1", "abc123")
 | 
				
			||||||
 | 
								.getForEntity(locationOfNewCashCard, String.class);
 | 
				
			||||||
   		assertThat(getResponse.getStatusCode()).isEqualTo(HttpStatus.OK);
 | 
					   		assertThat(getResponse.getStatusCode()).isEqualTo(HttpStatus.OK);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Validate created CashCard JSON 
 | 
					 | 
				
			||||||
		DocumentContext documentContext = JsonPath.parse(getResponse.getBody());
 | 
							DocumentContext documentContext = JsonPath.parse(getResponse.getBody());
 | 
				
			||||||
		Number id = documentContext.read("$.id");
 | 
							Number id = documentContext.read("$.id");
 | 
				
			||||||
		Double amount = documentContext.read("$.amount");
 | 
							Double amount = documentContext.read("$.amount");
 | 
				
			||||||
@ -75,7 +84,9 @@ class CashcardApplicationTests {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	@Test
 | 
						@Test
 | 
				
			||||||
	void shouldReturnAllCashCardsWhenListIsRequested() {
 | 
						void shouldReturnAllCashCardsWhenListIsRequested() {
 | 
				
			||||||
		ResponseEntity<String> response = restTemplate.getForEntity("/cashcards", String.class);
 | 
							ResponseEntity<String> response = restTemplate
 | 
				
			||||||
 | 
								.withBasicAuth("sarah1", "abc123")
 | 
				
			||||||
 | 
								.getForEntity("/cashcards", String.class);
 | 
				
			||||||
		assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
 | 
							assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		DocumentContext documentContext = JsonPath.parse(response.getBody());
 | 
							DocumentContext documentContext = JsonPath.parse(response.getBody());
 | 
				
			||||||
@ -91,7 +102,9 @@ class CashcardApplicationTests {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	@Test
 | 
						@Test
 | 
				
			||||||
	void shouldReturnAPageOfCashCards() {
 | 
						void shouldReturnAPageOfCashCards() {
 | 
				
			||||||
		ResponseEntity<String> response = restTemplate.getForEntity("/cashcards?page=0&size=1", String.class);
 | 
							ResponseEntity<String> response = restTemplate
 | 
				
			||||||
 | 
								.withBasicAuth("sarah1", "abc123")
 | 
				
			||||||
 | 
								.getForEntity("/cashcards?page=0&size=1", String.class);
 | 
				
			||||||
		assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
 | 
							assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		DocumentContext documentContext = JsonPath.parse(response.getBody());
 | 
							DocumentContext documentContext = JsonPath.parse(response.getBody());
 | 
				
			||||||
@ -101,7 +114,9 @@ class CashcardApplicationTests {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	@Test
 | 
						@Test
 | 
				
			||||||
	void shouldReturnASortedPageOfCashCards() {
 | 
						void shouldReturnASortedPageOfCashCards() {
 | 
				
			||||||
		ResponseEntity<String> response = restTemplate.getForEntity("/cashcards?page=0&size=1&sort=amount,desc", String.class);
 | 
							ResponseEntity<String> response = restTemplate
 | 
				
			||||||
 | 
								.withBasicAuth("sarah1", "abc123")
 | 
				
			||||||
 | 
								.getForEntity("/cashcards?page=0&size=1&sort=amount,desc", String.class);
 | 
				
			||||||
		assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
 | 
							assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		DocumentContext documentContext = JsonPath.parse(response.getBody());
 | 
							DocumentContext documentContext = JsonPath.parse(response.getBody());
 | 
				
			||||||
@ -114,7 +129,9 @@ class CashcardApplicationTests {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	@Test
 | 
						@Test
 | 
				
			||||||
	void shouldReturnASortedPageOfCashCardsWithNoParametersAndUseDefaultValues() {
 | 
						void shouldReturnASortedPageOfCashCardsWithNoParametersAndUseDefaultValues() {
 | 
				
			||||||
		ResponseEntity<String> response = restTemplate.getForEntity("/cashcards", String.class);
 | 
							ResponseEntity<String> response = restTemplate
 | 
				
			||||||
 | 
								.withBasicAuth("sarah1", "abc123")
 | 
				
			||||||
 | 
								.getForEntity("/cashcards", String.class);
 | 
				
			||||||
		assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
 | 
							assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		DocumentContext documentContext = JsonPath.parse(response.getBody());
 | 
							DocumentContext documentContext = JsonPath.parse(response.getBody());
 | 
				
			||||||
@ -124,4 +141,17 @@ class CashcardApplicationTests {
 | 
				
			|||||||
		JSONArray amounts = documentContext.read("$..amount");
 | 
							JSONArray amounts = documentContext.read("$..amount");
 | 
				
			||||||
		assertThat(amounts).containsExactly(1.00, 123.45, 150.00);
 | 
							assertThat(amounts).containsExactly(1.00, 123.45, 150.00);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Test
 | 
				
			||||||
 | 
						void shouldNotReturnACashCardWhenUsingBadCredentials() {
 | 
				
			||||||
 | 
							ResponseEntity<String> response = restTemplate
 | 
				
			||||||
 | 
								.withBasicAuth("BAD-USER", "abc123")
 | 
				
			||||||
 | 
								.getForEntity("/cashcards/99", String.class);
 | 
				
			||||||
 | 
							assertThat(response.getStatusCode()).isEqualTo(HttpStatus.UNAUTHORIZED);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							response = restTemplate
 | 
				
			||||||
 | 
								.withBasicAuth("sarah1", "BAD-PASSWORD")
 | 
				
			||||||
 | 
								.getForEntity("/cashcards/99", String.class);
 | 
				
			||||||
 | 
							assertThat(response.getStatusCode()).isEqualTo(HttpStatus.UNAUTHORIZED);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user