2012-05-08 7 views
10

estoy usando la primavera complemento del núcleo de seguridad (1.2.7) con griales 2.0cómo autenticar usuarios contra la Seguridad de la primavera en las pruebas unitarias

Digamos que tengo controlador con un método que utiliza la anotación @Secured.

class ArticleController { 
    def springSecurityService 

    @Secured(['ROLE_PREMIUM_USER']) 
    def listPremium() { 
     render 'premium content' 
    } 
} 

en mi prueba de la unidad me gustaría probar si un usuario con función 'ROLE_PREMIUM_USER' puede ver el contenido del método listPremium. ¿Cómo puedo hacer esto?

sé que debería comenzar la siguiente manera:

@TestFor(ArticleController) 
@Mock([SpringSecurityService]) 
class ArticleControllerTests { 
    void testListPremium() { 
    defineBeans { 
     springSecurityService(SpringSecurityService) 
    } 
     //but how to login the user here in order to see premium content? 

     controller.listPremium() 
     assert response.text() == 'premium content' 
    } 
} 

No estoy seguro de cómo puedo autenticar la acción fingida usuario o que comprueba ROLE_PREMIUM_USER. ¿Alguna ayuda?

+0

Tome un vistazo a este plugin: [primavera -security-mock] (http://grails.org/plugin/spring-security-mock) – mpccolorado

+0

prueba the controller.springSecurityServce.ifAnyGranted ("ROLE _PREMIUM_USER ") es posible que tenga que extender su clase desde ControllerUnitTestCase – allthenutsandbolts

Respuesta

5

Usted puede ser capaz de utilizar

SpringSecurityUtils.reauthenticate username, null 
+0

Parece que el enlace está roto. –

+1

Parece que refactorizaron el código, arreglé el enlace – chrislovecnm

4

Hemos creado nuestra AuthenticationHelper personalizado:

public final class AuthenticationHelper { 

    public static Authentication authenticate(UserDetailsService userDetailsServiceImpl, String userName) { 

     UserDetails userDetails = userDetailsServiceImpl.loadUserByUsername(userName); 

     UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(userDetails, userDetails.getPassword()); 

     UsernamePasswordAuthenticationToken result = new UsernamePasswordAuthenticationToken(userDetails, token.getCredentials(), userDetails.getAuthorities()); 
     result.setDetails(token.getDetails()); 
     Authentication auth = result; 

     SecurityContextHolder.getContext().setAuthentication(auth); 
     auth = SecurityContextHolder.getContext().getAuthentication(); 

     Assert.assertTrue(auth.isAuthenticated()); 

     return auth; 
    } 
} 

La parte importante es:

SecurityContextHolder.getContext().setAuthentication(auth); 
Cuestiones relacionadas