2013-11-01 15 views
5

Ho una configurazione operativa spring-security che avvolge i miei endpoint REST basati su jersey e consente l'accesso a livello di metodo.Come configurare JerseyTest con sicurezza di primavera?

progetto di esempio con tutto il necessario per riprodurre il problema in modo rapido: https://github.com/pulkitsinghal/dummy-rest-api

// Server-Side jersey resource 
@GET 
@Path("/protected/myendpoint/") 
@PreAuthorize("hasRole('DUMMY')") 
public String getMyEndpoint(){ 
    return "blah"; 
} 

Ma quando si scrivono i test di integrità per l'endpoint protetti, mi sono imbattuto nel seguente eccezione che si verifica solo nel reparto Prove :

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

Ecco ciò che la classe unit test basato JerseyTest assomiglia:

@Test 
public void testProtectedEndpoint() { 
    WebResource webResource = resource(); 
    webResource.addFilter(new HTTPBasicAuthFilter("username", "password")); 
    String responseMsg = webResource 
       .path("protected/myendpoint/") 
       .get(String.class); 
    System.out.println(responseMsg); 
} 

Qualcun altro si è imbattuto in questo problema durante l'installazione di un JerseyTest per un endpoint protetto con sicurezza a molla? Cosa si può fare al riguardo?

Ho una connessione remota qui: Spring Test & Security: How to mock authentication? ma non sono a un livello in cui potrei fare testa o croce su cosa sta succedendo in quel thread. Pensieri?

+1

È possibile pubblicare la traccia dello stack completo dell'eccezione e la configurazione di Spring Security? Inoltre, quali versioni di Spring, Spring Security e Jersey stai usando? –

+0

Aggiunto un progetto di esempio funzionante che dimostra il problema quando viene eseguito il test dell'unità, qui: https://github.com/pulkitsinghal/dummy-rest-api – pulkitsinghal

+0

È questo tipo di test unitario, qualcosa su cui semplicemente non funzionerà 'GrizzlyWebTestContainerFactory', non importa quale? – pulkitsinghal

risposta

1

Idealmente ho voluto un contenitore separato come GrizzlyWebTestContainerFactory come il webserver di prova quando l'esecuzione di test attraverso il ciclo di vita di default Maven: mvn clean test

Ma suppongo che, se non c'è una risposta giusta a questo allora come una soluzione utilizzando l'ExternalTestContainerFactory come il server web di test dovrà fare:

$ mvn clean package -DskipTests && (nohup foreman start &) 
$ mvn -Djersey.test.containerFactory=com.sun.jersey.test.framework.spi.container.external.ExternalTestContainerFactory \ 
    -Djersey.test.port=5000 \ 
    -Djersey.test.host=localhost \ 
    test 

NOTA: per chi non conosce foreman start basti pensare ad esso come tomcat start a tutti gli effetti intensivi in ​​questo caso d'uso.

Questo impedisce ancora ai controllori di controllare se i test sono interrotti e la sicurezza di primavera non funziona sul tomcat esterno in modo che funzioni, suppongo. È un po 'noioso trovare sempre il pid del processo in background di tomcat/java e ucciderlo per ripulirlo in seguito.

1

JerseyTest è in esecuzione su Grizzly in base all'impostazione predefinita e il tuo servizio Web restful fornisce un'impostazione di sicurezza primaverile su Tomcat, come esempio. Quindi, controlla che entrambi i server servlet abbiano la stessa impostazione.

+0

È piuttosto interessante! Per favore aiutami a capire, se lancio il JerseyTest e inizia in Grizzly, perché la configurazione di sicurezza della molla dovrebbe essere lanciata in tomcat? Ero abbastanza sicuro che il grizzly fosse responsabile dell'avvio sia del server che del test. – pulkitsinghal

+0

Se grizzly è il server di produzione e il server di staging, va bene e non è necessario alcun tipo di tomcat. Quindi, per favore controlla l'impostazione nella sottoclasse di JerseyTest se è uguale all'impostazione di produzione. – feuyeux

+0

Questo potrebbe aiutarti: https://github.com/alesaudate/kickstart-springjerseyhibernate/blob/master/src/test/java/com/alesaudate/samples/test/client/PersonClientTest.java – Muthu

Problemi correlati