Spring security 如何使用spring security设置JerseyTest?

Spring security 如何使用spring security设置JerseyTest?,spring-security,jersey,Spring Security,Jersey,我有一个有效的spring-security配置,它包装了基于jersey的REST端点,并允许方法级访问 样本项目,包括快速重现问题所需的一切: 但是,在为受保护端点编写健全性测试时,我遇到了以下异常,只发生在单元测试中: Caused by: org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found

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

样本项目,包括快速重现问题所需的一切:

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

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);
}
在为受spring安全保护的端点设置
JerseyTest
时,是否有其他人遇到此问题?对此我们能做些什么


我从远处看到了一些联系:但我还没有达到一个水平,我无法对这条线索中所发生的事情做出头绪或尾绪。想法?

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

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

但是我想,如果没有正确的答案,那么作为一种解决方法,使用ExternalTestContainerFactory作为测试Web服务器将不得不:

$ 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安全性不会在外部tomcat上呕吐,那么这仍然可以防止主控的签入,所以我想它是可行的。总是去寻找tomcat/java后台进程的
pid
,然后杀死它进行清理,这有点烦人。

这很有趣!请帮助我理解,如果我在Grizzly启动JerseyTest,为什么会在tomcat中启动spring安全配置?我很确定grizzly负责启动服务器和测试。如果grizzly是您的生产服务器和暂存服务器,那很好,不需要tomcat。因此,请检查JerseyTest子类上的设置是否与生产设置相同。这可能会帮助您:您可以发布异常的完整堆栈跟踪以及Spring安全配置吗?另外,您使用的是哪个版本的Spring、Spring Security和Jersey?添加了一个工作示例项目,演示了运行单元测试时的问题,这里是:这种单元测试是不是无论如何都无法在GrizzlyWebTestContainerFactory上工作?
$ 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