我有一个工作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?但是我没有达到我可以对该线程中发生的事情做出正面或反面的程度。想法?
答案 0 :(得分:0)
JerseyTest在默认情况下运行在Grizzly上,而你的restful web服务在Tomcat上提供了一个Spring安全设置 - 作为示例。所以,请检查两个servlet服务器是否具有相同的设置。
答案 1 :(得分:0)
理想情况下,当通过默认的maven生命周期运行测试时,我想要一个像GrizzlyWebTestContainerFactory
这样的单独容器作为测试网络服务器: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上进行barf,这仍然可以防止checkins掌握,所以我认为它可以解决。总是找到tomcat / java后台进程的pid
并将其杀死以便以后清理它有点烦人。