在Jersey Web服务中设置角色

时间:2016-09-14 10:35:00

标签: java jersey jetty dropwizard

我正在使用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.xmlwebdefault.xml所以定义应该在其他地方完成。

2 个答案:

答案 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的一些示例。