2017-10-06 105 views
5

说我有这个资源:Shiro:如何为使用@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(); 
    } 
} 

我应该写确认测试,某些(测试)用户从端点的响应,并且某些用户不?如果是这样的话:我该如何编写这些测试?我已经试过这样的事情:

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

} 

,但我不知道如何实际测试@RequiresRoles -annotation的功能。我已阅读Shiro's page on testing,但我无法写出失败的测试(例如,对没有WRITE角色的主题尝试访问/authhello/test)的测试。任何提示将不胜感激。

回答

6

我应该测试一下吗?

是的。如果您想确保某些角色将拥有或无法访问您的资源。这将是一个安全集成测试。

我应该如何设置整个应用程序+在测试中实际使用http请求调用它,如果我要测试它?还是有更简单的方法?

问题的一部分是,@RequiresAuthentication@RequiresRoles本身只是类和方法元信息。注释本身不提供安全检查功能。

从你的问题中不清楚你正在使用什么类型的容器,但我可以猜测它是普通的Jersey JAX-RS服务(对吗?)。对于Shiro执行安全检查,您应该在您的端点周围添加一些JAX-RS过滤器(或许有其他方式?)。为了测试安全性,您应该在测试中复制此设置。否则,没有引擎处理您的注释,并因此没有安全检查。

+0

谢谢你花时间回答。经过一番认真的挖掘和阅读之后,我意识到我正如你所说,错过了一些设置代码。我设法在我的测试中复制了在应用程序中完成的设置(尽管很遗憾,我无法在此分享示例)。 – L42