2012-01-20 20 views
12

Tengo un método de depósito anotado con @Secured. Intento escribir una prueba unitaria para este método, pero mi prueba falla porque necesito autenticación para llamar al método. El método en sí, pasa a ser el método save(). El error que consigo cuando llamo el método es:burying authentication spring security

org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext 

no puedo probar este método, ya que requiere autenticación, y no puedo guardar un usuario para la autenticación en (estoy usando hsqldb) debido a que tendría que llamar a este método para guardar. Cualquier consejo sobre cómo probar un método anotado con @secured o cómo simular la autenticación.

Respuesta

15

Depende de lo que quiere probar.

  • Si quiere probar la lógica de negocios de su aplicación sin ningún tipo de seguridad, puede deshabilitar la seguridad por completo. Suponiendo que usa SpringJunit4Runner, puede poner la configuración de seguridad en un archivo separado y no incluirlo en @ContextConfiguration.

  • Si desea probar autorización (por ejemplo correcto trabajo de @Secured anotaciones), puede acceder a SecurityContext directamente, sin pasar por todas las cosas relacionadas con la autenticación (en este caso se puede poner la configuración de autenticación en un archivo separado y no cargarlo también):

    Todo lo que necesita es poner un objeto apropiado Authentication en SecurityContextHolder:

    @Test 
    public void myTest() { 
        login(...); 
        ... 
        logout(); 
    } 
    
    private void login(...) { 
        SecurityContextHolder.getContext().setAuthentication(
         new UsernamePasswordAuthenticationToken(...) 
        ) 
    } 
    
    private void logout() { 
        SecurityContextHolder.clearContext(); 
    } 
    
  • por último, si desea probar la autenticación, puede ejecutar la prueba con los datos de prueba que contiene la base de datos .

+0

lamentablemente no puedo hacer esto. Mi administrador de autenticación es un userDetailService personalizado que usa mi repositorio para buscar al usuario desde una base de datos. Por lo tanto, si no puedo guardar a un usuario para que persista, el userDetailsService no encontrará al usuario y, por lo tanto, dará como resultado una excepción BadCredentials. –

+0

@vikashdat: Actualizado – axtavt

5

a) Esto no es una prueba de la unidad, que es una prueba de integración. Una prueba unitaria no sería un problema.

b) Intentaré mantener las configuraciones de prueba separadas. ¿Por qué no solo desactivar la seguridad de primavera en pruebas en las que no está probando funciones relacionadas con la seguridad?

c) Si falla todo lo demás: inyecte un objeto JdbcTemplate y cree manualmente los datos del usuario en SQL durante la instalación de la prueba. Ver Support classes for integration testing

+0

no sabía que era posible desactivar la seguridad en tiempo de ejecución. ¿Tiene un recurso que me puede vincular también para ver cómo desactivar la seguridad? –

+0

@vikashdat Hágalo de la otra manera: no lo active. Por supuesto, eso depende del tipo de prueba que sea. Si está realizando pruebas en un servidor desplegado, puede que no sea una opción. –

+0

No estoy seguro de entender ... ¿cómo puedo no activarlo? ¿Te refieres a no ejecutar las pruebas con SpringJunit4Runner? si hago esto, perderé la capacidad de autoaumentar componentes. –

Cuestiones relacionadas