5

我有一个工作spring-security配置,它包装了我的基于球衣的 REST 端点并允许方法级访问。

包含快速重现问题所需的一切的示例项目:https ://github.com/pulkitsinghal/dummy-rest-api

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

但是在为受保护的端点编写健全性测试时,我遇到了以下仅在单元测试中发生的异常:

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

下面是基于 JerseyTest 的单元测试类的样子:

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

JerseyTest在为受弹簧安全保护的端点设置时,有没有其他人遇到过这个问题?可以做些什么呢?

我在这里远程看到了一些连接:Spring Test & Security: How to mock authentication?但我还没有达到可以对该线程中发生的事情做出正面或反面的水平。想法?

4

2 回答 2

0

JerseyTest 默认在 Grizzly 上运行,并且您的 restful web 服务在 Tomcat 上给出了 spring 安全设置——作为示例。因此,请检查两个 servlet 服务器是否具有相同的设置。

于 2013-11-15T07:19:48.127 回答
0

GrizzlyWebTestContainerFactory理想情况下,当通过默认的 Maven 生命周期运行测试时,我想要一个单独的容器,例如测试网络服务器:mvn clean test

但我想,如果没有正确的答案,那么作为测试网络服务器必须使用 ExternalTestContainerFactory 的解决方法:

$ 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

注意:对于那些不熟悉的人,foreman start只需将其视为tomcat start此用例中的所有密集目的。

如果测试被破坏并且spring-security不会在外部tomcat上出现问题,这仍然可以防止签入掌握,所以我想它可以解决。pid总是去寻找tomcat / java后台进程并在之后将其杀死以进行清理有点烦人。

于 2014-01-27T16:14:58.200 回答