我正在开发一个代码内容限制层,它基本上可以防止在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
。有什么想法吗?
答案 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);
}
注意:如果您使用自定义UserDetailsService并且不返回User对象,则可能希望将User替换为您正在使用的自定义UserDetails。