2017-10-06 3 views
5

ai dis-je cette ressource:Shiro: Comment écrire un test pour un point final protégé par @RequiresRoles?

import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.PathParam; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 

import org.apache.shiro.authz.annotation.RequiresAuthentication; 
import org.apache.shiro.authz.annotation.RequiresRoles; 

import io.swagger.annotations.Api; 
import io.swagger.annotations.ApiOperation; 

@Path("/authhello") 
@Api(value = "hello", description = "Simple endpoints for testing api authentification", 
    hidden = true) 
@Produces(MediaType.APPLICATION_JSON) 
@RequiresAuthentication 
public class AuthenticatedHelloWorldResource { 

    private static final String READ = "READ"; 
    private static final String WRITE = "WRITE"; 

    @GET 
    @ApiOperation(value = "helloworld", 
     notes = "Simple hello world.", 
     response = String.class) 
    @RequiresRoles(READ) 
    public Response helloWorld() { 
    String hello = "Hello world!"; 
    return Response.status(Response.Status.OK).entity(hello).build(); 
    } 

    @GET 
    @Path("/{param}") 
    @ApiOperation(value = "helloReply", 
     notes = "Returns Hello you! and {param}", 
     response = String.class) 
    @RequiresRoles(WRITE) 
    public Response getMsg(@PathParam("param") String msg) { 
    String output = "Hello you! " + msg; 
    return Response.status(Response.Status.OK).entity(output).build(); 
    } 
} 

Dois-je écrire des tests qui confirment que certains (test) les utilisateurs obtiennent une réponse des critères d'évaluation, et certains utilisateurs ne sont pas? Et si oui: comment puis-je écrire ces tests? J'ai essayé quelque chose comme ceci:

import javax.ws.rs.core.Application; 

import org.glassfish.jersey.server.ResourceConfig; 
import org.junit.Test; 

import com.cognite.api.shiro.AbstractShiroTest; 

import static org.junit.Assert.assertEquals; 

public class AuthenticatedHelloWorldTest extends AbstractShiroTest { 

    @Override 
    protected Application configure() { 
    return new ResourceConfig(AuthenticatedHelloWorldResource.class); 
    } 

    @Test 
    public void testAuthenticatedReadHelloWorld() { 
    final String hello = target("/authhello").request().get(String.class); 
    assertEquals("Hello world!", hello); 
    } 

    @Test 
    public void testAuthenticatedWriteHelloWorld() { 
    final String hello = target("/authhello/test").request().get(String.class); 
    assertEquals("Hello you! test", hello); 
    } 

} 

mais je ne suis pas sûr de savoir comment tester réellement la fonction de la @RequiresRoles -annotation. J'ai lu Shiro's page on testing, mais je n'ai pas réussi à écrire un test qui échoue (par exemple un test pour un sujet qui n'a pas le rôle WRITE essayant d'accéder à /authhello/test). Des conseils seraient appréciés.

Répondre

6

Dois-je tester même cela?

Oui. Pourvu que vous voulez vous assurer que certains rôles auront ou ont pas accès à votre ressource. Ce sera un test d'intégration de sécurité.

Comment dois-je procéder pour configurer l'ensemble de l'application + l'appeler réellement avec une requête http dans un test si je dois la tester? Ou y a-t-il un moyen plus simple?

Une partie de la question est que @RequiresAuthentication et @RequiresRoles eux-mêmes ne sont que la classe et la méthode des méta-informations. Les annotations elles-mêmes ne fournissent pas la fonctionnalité de vérification de sécurité.

Il n'est pas clair à partir de votre question quel type de conteneur que vous utilisez, mais je peux deviner que c'est le service Jersey JAX-RS ordinaire (ai-je raison?). Pour Shiro effectuer des contrôles de sécurité, vous devriez avoir ajouté un filtre JAX-RS (peut-être d'une autre manière?) autour de vos points de terminaison. Pour tester la sécurité, vous devez répliquer cette configuration dans vos tests. Sinon, il n'y a pas de moteur traitant vos annotations et aucun contrôle de sécurité en conséquence.

+0

Merci d'avoir pris le temps de répondre. Après quelques recherches sérieuses et de la lecture, je compris que j'étais, comme vous l'avez dit, manquant un code de configuration. J'ai réussi à reproduire la configuration effectuée dans l'application dans mon test (bien que je ne suis malheureusement pas en mesure de partager un exemple ici). – L42