我正在使用Jersey + Jetty + Dropwizard + Hibernate创建一个Web服务。
我们说我有这样的网络资源:
@Path("/")
@PermitAll
public class Resource {
@RolesAllowed("user")
@GET
public String get() { return "GET"; }
@RolesAllowed("admin")
@POST
public String post(String content) { return content; }
@Path("sub")
public SubResource getSubResource() {
return new SubResource();
}
}
我知道您可以使用HttpServletRequest.isUserInRole
检查用户的角色。
问题是,如何分配角色? Jersey如何知道要为isUserInRole
方法返回什么,或者知道如何过滤人们根据他们的角色获取特定资源?
我没有web.xml
或webdefault.xml
所以定义应该在其他地方完成。
答案 0 :(得分:0)
你必须提供一个支持@RolesAllowed(“admin”)注释的提供者类,然后你必须在你的应用程序中注册提供者类。通常它是在web.xml中完成的,但是你没有使用它,你必须自己提供它。相关的例子可能是here
答案 1 :(得分:0)
Jersey使用自己的机制来检查角色(请参阅SecurityContext
接口),但是如果没有明确设置,则会回退到容器身份验证,这通常是使用JaaS实现的。如果你有web.xml
,那么你就可以在那里配置它的基础知识。
然后再次频繁地进行身份验证。如果您可以手动登录用户,例如有一个可以检查名称/密码的服务,那么您可以实现一个ContainerRequestFilter
来填充安全上下文,这将使@RolesAllowed
注释正常工作。
例如:
根据评论更新
在用户中输入方法日志:
@Path("some/login/path")
public void login() {
String name = getUsernameFromRequest();
String password = // like above
User user = loginService.login(name, password);
request.getSession().addAttribute("user", user);
}
在过滤器中为所有请求初始化安全上下文。
@Priority(Priorities.AUTHENTICATION)
public class JerseySecurityContextFilter implements ContainerRequestFilter {
public void filter(final ContainerRequestContext context) throws IOException {
User user = getUserFromSession();
if (user != null) {
// this sets security context for the rest of processing
// it should make @RolesAllowed work
context.setSecurityContext(new JerseySecurityContext(user);
}
}
final class JerseySecurityContext implements SecurityContext {
private final User user;
public JerseySecurityContext(final User user) {
this.user = user;
}
public boolean isUserInRole(final String roleName) {
return user.hasRole(roleName);
}
public Principal getUserPrincipal() {
return new Principal() {
public String getName() {
return user.getName();
}
};
}
public String getAuthenticationScheme() {
return null;
}
}
如果您更愿意使用JaaS,则必须在应用程序配置中配置安全性。这些是嵌入式Jetty的一些示例。