spring-boot 3.1 and spring-addons 7.1.10 (#14902)
This commit is contained in:
+43
-13
@@ -3,28 +3,49 @@ package com.baeldung;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.TestInstance;
|
||||
import org.junit.jupiter.api.TestInstance.Lifecycle;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.MethodSource;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
|
||||
import org.springframework.boot.test.mock.mockito.MockBean;
|
||||
import org.springframework.context.annotation.Import;
|
||||
import org.springframework.security.access.AccessDeniedException;
|
||||
import org.springframework.security.authentication.AbstractAuthenticationToken;
|
||||
import org.springframework.security.authentication.AuthenticationCredentialsNotFoundException;
|
||||
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
|
||||
import org.springframework.security.core.Authentication;
|
||||
import org.springframework.security.oauth2.core.oidc.StandardClaimNames;
|
||||
import org.springframework.security.oauth2.jwt.JwtDecoder;
|
||||
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken;
|
||||
import org.springframework.security.test.context.support.WithAnonymousUser;
|
||||
import org.springframework.security.test.context.support.WithMockUser;
|
||||
import org.springframework.test.context.junit.jupiter.SpringExtension;
|
||||
|
||||
import com.baeldung.ServletResourceServerApplication.MessageService;
|
||||
import com.c4_soft.springaddons.security.oauth2.test.annotations.OpenIdClaims;
|
||||
import com.c4_soft.springaddons.security.oauth2.test.annotations.WithMockJwtAuth;
|
||||
import com.baeldung.ServletResourceServerApplication.SecurityConf;
|
||||
import com.c4_soft.springaddons.security.oauth2.test.AuthenticationFactoriesTestConf;
|
||||
import com.c4_soft.springaddons.security.oauth2.test.annotations.WithJwt;
|
||||
import com.c4_soft.springaddons.security.oauth2.test.annotations.parameterized.ParameterizedAuthentication;
|
||||
|
||||
@Import({ MessageService.class })
|
||||
@Import({ MessageService.class, SecurityConf.class })
|
||||
@ImportAutoConfiguration(AuthenticationFactoriesTestConf.class)
|
||||
@ExtendWith(SpringExtension.class)
|
||||
@EnableMethodSecurity
|
||||
@TestInstance(Lifecycle.PER_CLASS)
|
||||
class MessageServiceUnitTest {
|
||||
@Autowired
|
||||
MessageService messageService;
|
||||
|
||||
@Autowired
|
||||
WithJwt.AuthenticationFactory authFactory;
|
||||
|
||||
@MockBean
|
||||
JwtDecoder jwtDecoder;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* greet() */
|
||||
/* Expects a JwtAuthenticationToken to be retrieved from the security-context */
|
||||
@@ -41,10 +62,12 @@ class MessageServiceUnitTest {
|
||||
assertThrows(AccessDeniedException.class, () -> messageService.getSecret());
|
||||
}
|
||||
|
||||
@Test
|
||||
@WithMockJwtAuth(authorities = { "admin", "ROLE_AUTHORIZED_PERSONNEL" }, claims = @OpenIdClaims(preferredUsername = "ch4mpy"))
|
||||
void givenSecurityContextIsPopulatedWithJwtAuthenticationToken_whenGreet_thenReturnGreetingWithPreferredUsernameAndAuthorities() {
|
||||
assertEquals("Hello ch4mpy! You are granted with [admin, ROLE_AUTHORIZED_PERSONNEL].", messageService.greet());
|
||||
@ParameterizedTest
|
||||
@MethodSource("allIdentities")
|
||||
void givenUserIsAuthenticated_whenGreet_thenReturnGreetingWithPreferredUsernameAndAuthorities(@ParameterizedAuthentication Authentication auth) {
|
||||
final var jwt = (JwtAuthenticationToken) auth;
|
||||
final var expected = "Hello %s! You are granted with %s.".formatted(jwt.getTokenAttributes().get(StandardClaimNames.PREFERRED_USERNAME), auth.getAuthorities());
|
||||
assertEquals(expected, messageService.greet());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -65,15 +88,22 @@ class MessageServiceUnitTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
@WithMockJwtAuth(authorities = { "admin", "ROLE_AUTHORIZED_PERSONNEL" }, claims = @OpenIdClaims(preferredUsername = "ch4mpy"))
|
||||
void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecret_thenReturnSecret() {
|
||||
@WithJwt("ch4mpy.json")
|
||||
void givenUserIsCh4mpy_whenGetSecret_thenReturnSecret() {
|
||||
assertEquals("Only authorized personnel can read that", messageService.getSecret());
|
||||
}
|
||||
|
||||
@Test
|
||||
@WithMockJwtAuth(authorities = { "admin" }, claims = @OpenIdClaims(preferredUsername = "ch4mpy"))
|
||||
void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecret_thenThrowsAccessDeniedException() {
|
||||
@WithJwt("tonton-pirate.json")
|
||||
void givenUserIsTontonPirate_whenGetSecret_thenThrowsAccessDeniedException() {
|
||||
assertThrows(AccessDeniedException.class, () -> messageService.getSecret());
|
||||
}
|
||||
|
||||
/*--------------------------------------------*/
|
||||
/* methodSource returning all test identities */
|
||||
/*--------------------------------------------*/
|
||||
private Stream<AbstractAuthenticationToken> allIdentities() {
|
||||
final var authentications = authFactory.authenticationsFrom("ch4mpy.json", "tonton-pirate.json").toList();
|
||||
return authentications.stream();
|
||||
}
|
||||
}
|
||||
|
||||
+7
-7
@@ -12,8 +12,8 @@ import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
|
||||
import org.springframework.security.test.context.support.WithAnonymousUser;
|
||||
import org.springframework.test.web.servlet.MockMvc;
|
||||
|
||||
import com.c4_soft.springaddons.security.oauth2.test.annotations.OpenIdClaims;
|
||||
import com.c4_soft.springaddons.security.oauth2.test.annotations.WithMockJwtAuth;
|
||||
import com.c4_soft.springaddons.security.oauth2.test.annotations.WithJwt;
|
||||
import com.c4_soft.springaddons.security.oauth2.test.annotations.WithMockAuthentication;
|
||||
|
||||
@SpringBootTest(webEnvironment = WebEnvironment.MOCK)
|
||||
@AutoConfigureMockMvc
|
||||
@@ -34,7 +34,7 @@ class ServletResourceServerApplicationIntegrationTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
@WithMockJwtAuth(authorities = { "admin", "ROLE_AUTHORIZED_PERSONNEL" }, claims = @OpenIdClaims(preferredUsername = "ch4mpy"))
|
||||
@WithJwt("ch4mpy.json")
|
||||
void givenUserIsAuthenticated_whenGetGreet_thenOk() throws Exception {
|
||||
api.perform(get("/greet"))
|
||||
.andExpect(status().isOk())
|
||||
@@ -54,7 +54,7 @@ class ServletResourceServerApplicationIntegrationTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
@WithMockJwtAuth("ROLE_AUTHORIZED_PERSONNEL")
|
||||
@WithMockAuthentication("ROLE_AUTHORIZED_PERSONNEL")
|
||||
void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenOk() throws Exception {
|
||||
api.perform(get("/secured-route"))
|
||||
.andExpect(status().isOk())
|
||||
@@ -62,7 +62,7 @@ class ServletResourceServerApplicationIntegrationTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
@WithMockJwtAuth("admin")
|
||||
@WithMockAuthentication("admin")
|
||||
void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenForbidden() throws Exception {
|
||||
api.perform(get("/secured-route"))
|
||||
.andExpect(status().isForbidden());
|
||||
@@ -81,7 +81,7 @@ class ServletResourceServerApplicationIntegrationTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
@WithMockJwtAuth("ROLE_AUTHORIZED_PERSONNEL")
|
||||
@WithMockAuthentication("ROLE_AUTHORIZED_PERSONNEL")
|
||||
void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecuredMethod_thenOk() throws Exception {
|
||||
api.perform(get("/secured-method"))
|
||||
.andExpect(status().isOk())
|
||||
@@ -89,7 +89,7 @@ class ServletResourceServerApplicationIntegrationTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
@WithMockJwtAuth("admin")
|
||||
@WithMockAuthentication("admin")
|
||||
void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredMethod_thenForbidden() throws Exception {
|
||||
api.perform(get("/secured-method"))
|
||||
.andExpect(status().isForbidden());
|
||||
|
||||
+14
-9
@@ -8,16 +8,19 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
|
||||
import org.springframework.boot.test.mock.mockito.MockBean;
|
||||
import org.springframework.security.core.Authentication;
|
||||
import org.springframework.security.test.context.support.WithAnonymousUser;
|
||||
import org.springframework.test.web.servlet.MockMvc;
|
||||
|
||||
import com.baeldung.ServletResourceServerApplication.GreetingController;
|
||||
import com.baeldung.ServletResourceServerApplication.MessageService;
|
||||
import com.c4_soft.springaddons.security.oauth2.test.annotations.OpenIdClaims;
|
||||
import com.c4_soft.springaddons.security.oauth2.test.annotations.WithMockJwtAuth;
|
||||
import com.c4_soft.springaddons.security.oauth2.test.annotations.WithMockAuthentication;
|
||||
import com.c4_soft.springaddons.security.oauth2.test.annotations.parameterized.AuthenticationSource;
|
||||
import com.c4_soft.springaddons.security.oauth2.test.annotations.parameterized.ParameterizedAuthentication;
|
||||
|
||||
@WebMvcTest(controllers = GreetingController.class, properties = { "server.ssl.enabled=false" })
|
||||
class SpringAddonsGreetingControllerUnitTest {
|
||||
@@ -40,9 +43,11 @@ class SpringAddonsGreetingControllerUnitTest {
|
||||
.andExpect(status().isUnauthorized());
|
||||
}
|
||||
|
||||
@Test
|
||||
@WithMockJwtAuth(authorities = { "admin", "ROLE_AUTHORIZED_PERSONNEL" }, claims = @OpenIdClaims(preferredUsername = "ch4mpy"))
|
||||
void givenUserIsAuthenticated_whenGetGreet_thenOk() throws Exception {
|
||||
@ParameterizedTest
|
||||
@AuthenticationSource({
|
||||
@WithMockAuthentication(authorities = { "admin", "ROLE_AUTHORIZED_PERSONNEL" }, name = "ch4mpy"),
|
||||
@WithMockAuthentication(authorities = { "uncle", "PIRATE" }, name = "tonton-pirate") })
|
||||
void givenUserIsAuthenticated_whenGetGreet_thenOk(@ParameterizedAuthentication Authentication auth) throws Exception {
|
||||
final var greeting = "Whatever the service returns";
|
||||
when(messageService.greet()).thenReturn(greeting);
|
||||
|
||||
@@ -66,7 +71,7 @@ class SpringAddonsGreetingControllerUnitTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
@WithMockJwtAuth({ "admin", "ROLE_AUTHORIZED_PERSONNEL" })
|
||||
@WithMockAuthentication({ "admin", "ROLE_AUTHORIZED_PERSONNEL" })
|
||||
void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenOk() throws Exception {
|
||||
final var secret = "Secret!";
|
||||
when(messageService.getSecret()).thenReturn(secret);
|
||||
@@ -77,7 +82,7 @@ class SpringAddonsGreetingControllerUnitTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
@WithMockJwtAuth({ "admin" })
|
||||
@WithMockAuthentication({ "admin" })
|
||||
void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenForbidden() throws Exception {
|
||||
api.perform(get("/secured-route"))
|
||||
.andExpect(status().isForbidden());
|
||||
@@ -96,7 +101,7 @@ class SpringAddonsGreetingControllerUnitTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
@WithMockJwtAuth({ "admin", "ROLE_AUTHORIZED_PERSONNEL" })
|
||||
@WithMockAuthentication({ "admin", "ROLE_AUTHORIZED_PERSONNEL" })
|
||||
void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecuredMethod_thenOk() throws Exception {
|
||||
final var secret = "Secret!";
|
||||
when(messageService.getSecret()).thenReturn(secret);
|
||||
@@ -107,7 +112,7 @@ class SpringAddonsGreetingControllerUnitTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
@WithMockJwtAuth(authorities = { "admin" })
|
||||
@WithMockAuthentication({ "admin" })
|
||||
void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredMethod_thenForbidden() throws Exception {
|
||||
api.perform(get("/secured-method"))
|
||||
.andExpect(status().isForbidden());
|
||||
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"iss": "https://localhost:8443/realms/master",
|
||||
"sub": "281c4558-550c-413b-9972-2d2e5bde6b9b",
|
||||
"iat": 1695992542,
|
||||
"exp": 1695992642,
|
||||
"preferred_username": "ch4mpy",
|
||||
"realm_access": {
|
||||
"roles": [
|
||||
"admin",
|
||||
"ROLE_AUTHORIZED_PERSONNEL"
|
||||
]
|
||||
},
|
||||
"email": "ch4mp@c4-soft.com",
|
||||
"scope": "openid email"
|
||||
}
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"iss": "https://localhost:8443/realms/master",
|
||||
"sub": "2d2e5bde6b9b-550c-413b-9972-281c4558",
|
||||
"iat": 1695992551,
|
||||
"exp": 1695992651,
|
||||
"preferred_username": "tonton-pirate",
|
||||
"realm_access": {
|
||||
"roles": [
|
||||
"uncle",
|
||||
"PIRATE"
|
||||
]
|
||||
},
|
||||
"email": "tonton-pirate@c4-soft.com",
|
||||
"scope": "openid email"
|
||||
}
|
||||
Reference in New Issue
Block a user