es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Es posible cargar solo la configuración de seguridad de Spring en mis pruebas con JUnit 5?

Quiero realizar pruebas unitarias de seguridad en mis controladores utilizando el método de seguridad basado en métodos. Cuando revisé la documentación, encontré esto, pero utiliza @RunWith y no parece cargar solo la configuración de seguridad.

Lo que intenté hacer:
Cargar mi configuración de seguridad

@ContextConfiguration(classes = {SecurityConfigImpl.class})
public class PeopleGQLApiSecutiryTest {
    private final PersonService personService = mock(PersonService.class);
    private final PeopleGQLApi peopleGQLApi = new PeopleGQLApi(personService);

    @Test
    @WithAnonymousUser
    void itShouldCreateNewPerson() {
        when(personService.createNewPerson(any(Person.class))).thenReturn(new Person());
        // ¡esto debería fallar!
        peopleGQLApi.createPerson(
                Person.LevelEnum.WEAK,
                // resto de los argumentos
        );
    }
}

Esto debería fallar (lanzar una excepción o algo así) porque createPerson es una función segura con ROLE_ADMIN.

Nota: esto es una mutación de GraphQL

@MutationMapping("createPerson")
@Secured({"ROLE_ADMIN"})
public Person createPerson(
   @Argument("level") Level level,
         // resto de los argumentos
) {
         // implementación del método
}

No puedo utilizar @SpringBootTest completo porque también tendría que proporcionar la configuración de MongoDB, lo cual está fuera del alcance de esta prueba.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para probar unitariamente la seguridad de los controladores utilizando la seguridad basada en métodos, puedes utilizar las anotaciones @WithMockUser o @WithAnonymousUser proporcionadas por Spring Security. Sin embargo, al revisar la documentación, has encontrado un ejemplo que utiliza @RunWith, lo cual parece cargar no solo la configuración de seguridad.

    En lugar de utilizar @RunWith, puedes usar la anotación @ContextConfiguration para especificar la clase de configuración de seguridad que deseas cargar. En tu ejemplo, has intentado hacer esto especificando la clase SecurityConfigImpl.

    Para probar una función segura, puedes utilizar @WithMockUser(roles="ROLE_ADMIN") para simular un usuario con el rol requerido. En tu caso, puedes utilizar @WithAnonymousUser para simular un usuario anónimo y comprobar que el método createPerson esté protegido.

    Aquí tienes una versión actualizada de tu caso de prueba de ejemplo utilizando @ContextConfiguration y @WithAnonymousUser:

    @ContextConfiguration(classes = {SecurityConfigImpl.class})
    public class PeopleGQLApiSecurityTest {
        private final PersonService personService = mock(PersonService.class);
        private final PeopleGQLApi peopleGQLApi = new PeopleGQLApi(personService);
    
        @Test(expected = AccessDeniedException.class)
        @WithAnonymousUser
        void itShouldCreateNewPerson() {
            when(personService.createNewPerson(any(Person.class))).thenReturn(new Person());
            peopleGQLApi.createPerson(
                    Person.LevelEnum.WEAK,
                    // rest of the arguments
            );
        }
    }
    

    En este ejemplo, estamos utilizando @WithAnonymousUser para simular un usuario anónimo y comprobamos que el método createPerson falle con una AccessDeniedException.

Comments are closed.