如何在JerseyTest中设置模拟Spring用户主体?

时间:2014-03-12 16:05:25

标签: java spring spring-security jersey

我正在开发一个代码内容限制层,它基本上可以防止在GET响应中返回某些JSON元素。

为此,我需要检查由Spring的安全上下文提供的经过身份验证的用户主体,自定义我的响应,然后将其发送回客户端。

所以......我的问题是如何使用没有安全上下文的JerseyTest来做到这一点?我需要以某种方式设置一个模拟身份验证主体,Jersey将在处理GET请求时找到它。

这是我的测试:

import org.junit.Test;
import org.springframework.web.context.ContextLoaderListener;

import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.spi.spring.container.servlet.SpringServlet;
import com.sun.jersey.test.framework.JerseyTest;
import com.sun.jersey.test.framework.WebAppDescriptor;

public class GroupResourceTest extends JerseyTest {

    public GroupResourceTest() throws Exception {
super(new WebAppDescriptor.Builder().contextPath("/api-resources-test")
        .contextParam("contextConfigLocation", "file:src/test/resources/applicationContext-test.xml")
        .servletClass(SpringServlet.class).contextListenerClass(ContextLoaderListener.class)
        .initParam("com.sun.jersey.api.json.POJOMappingFeature", "true").build());
    }

    @Test
    public void testGroupsGET() {
        WebResource webResource = resource();

        String response = webResource.path("/groups").get(String.class);

        System.out.println(response);
    }
}

以下是我需要与模拟用户关联的相应资源:

@GET
@Path("/groups")
@Produces({ MediaType.APPLICATION_JSON })
public List<Group> getGroups() {
Authentication user = SecurityContextHolder.getContext().getAuthentication();

// do user-based response here...
}

使用此代码,上面的user对象为null。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您应该可以使用以下方法执行此操作:

@After
public void cleanup() {
    SecurityContextHolder.clearContext();
}

@Test
public void testGroupsGET() {
    User user = 
       new User("user","notused",AuthorityUtils.createAuthorityList("ROLE_USER"));
    Authentication auth = 
       new UsernamePasswordAuthenticationToken(user,user.getPassword(),user.getAuthorities());
    SecurityContextHolder.getContext().setAuthentication(auth);

    WebResource webResource = resource();

    String response = webResource.path("/groups").get(String.class);

    System.out.println(response);
}

注意:如果您使用自定义UserDetailsS​​ervice并且不返回User对象,则可能希望将User替换为您正在使用的自定义UserDetails。