2012-05-08 1 views
10

I Federsicherheitskern-Plugin bin mit (1.2.7) mit Grails 2.0Wie Benutzer gegen Feder Sicherheit in Unit-Tests authentifizieren

Lasst uns sagen, dass ich Controller mit einer Methode, die @Secured Annotation verwendet.

class ArticleController { 
    def springSecurityService 

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

in meiner Unit-Test würde ich testen möchte, ob ein Benutzer mit Rolle ‚ROLE_PREMIUM_USER‘ Gehalt an listPremium Methode sehen kann. Wie kann ich das machen?

Ich weiß, dass es anfangen sollte wie folgt:

@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' 
    } 
} 

Ich bin nicht sicher, wie ich Benutzer oder Mock-Aktion, die ROLE_PREMIUM_USER prüft authentifizieren kann. Irgendeine Hilfe?

+0

Werfen Sie einen Blick auf dieses Plugin: [Frühling -Sicherheit-Mock] (http://grails.org/plugin/spring-security-mock) – mpccolorado

+0

versuchen Sie die controller.springSecurityServce.ifAnyGranted ("ROLE _PREMIUM_USER ") müssen Sie Ihre Klasse möglicherweise von ControllerUnitTestCase erweitern – allthenutsandbolts

Antwort

5

Unter Umständen können Sie verwenden

SpringSecurityUtils.reauthenticate username, null 
+0

Sieht so aus, als wäre die Verbindung unterbrochen. –

+1

Sieht so aus, als hätten sie den Code überarbeitet, ich habe den Link repariert – chrislovecnm

4

Wir unsere eigene AuthenticationHelper erstellt:

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; 
    } 
} 

Der wichtigste Teil ist:

SecurityContextHolder.getContext().setAuthentication(auth);