在查看了不同的选项后,我使用了身份验证过滤器和基本身份验证。非常容易实现。
一些示例代码:
您需要一个过滤器
public class AuthFilter implements ResourceFilter, ContainerRequestFilter {
...
}
还有一个安全上下文:
public class MySecurityContext implements SecurityContext {
...
}
还有一个用户类:
public class User implements Serializable, Principal {
...
}
最后,您可以像这样添加所需的过滤器:(将您的ResourceConfig对象传递给此函数)
private void prepareFilters(ResourceConfig rc) {
rc.getProperties().put("com.sun.jersey.spi.container.ContainerRequestFilters",
getClassListing(new Class[]{
AuthFilter.class
}));
rc.getProperties().put("com.sun.jersey.spi.container.ContainerResponseFilters",
getClassListing(new Class[]{
CORSFilter.class,
GZIPContentEncodingFilter.class
}));
rc.getProperties().put("com.sun.jersey.spi.container.ResourceFilters",
getClassListing(new Class[]{
RolesAllowedResourceFilterFactory.class
}));
}
另外,您可以将 @Context SecurityContext securityContext;
添加到您的资源类或个别方法中以实现更细粒度的访问控制。SecurityContext 将被注入到您的资源上下文中,因此您可以每个请求访问用户对象。
使用这种设置,您可以在 REST 方法中注释 @PermitAll
, @RolesAllowed
等,从而对 RESTful 接口进行良好的控制。
我刚刚用 Jersey 完成了我的无状态(无会话)用户身份验证和管理。如果您想要完整的示例或自己试试,请告诉我;)