使用ContainerRequestFilter在Jersey Web Service中自定义@RolesAllowed角色

时间:2012-03-06 20:20:52

标签: java java-ee jersey jax-rs servlet-filters

我使用ContainerRequestFilter接口创建了一个过滤器,并尝试分配返回用户实体的自定义角色。

 @Override
public ContainerRequest filter(ContainerRequest request) {
    User user = authenticate(request);
    if (user != null) {
        request.setSecurityContext(new Authorizer(user));
    } else {
        throw new WebApplicationException(400);
    }
    return request;

}

 private User authenticate(ContainerRequest request) {

    user = new User("erhan", "customRole");


    return user;
}

public class Authorizer implements SecurityContext {

    private User user;
    private Principal principal;

    public Authorizer(final User user) {
        this.user = user;
        this.principal = new Principal() {

            public String getName() {
                return user.username;
            }
        };
    }

    public Principal getUserPrincipal() {
        return this.principal;
    }

    public boolean isUserInRole(String role) {
        return (role.equals(user.role));
    }

    public boolean isSecure() {
        return "https".equals(uriInfo.getRequestUri().getScheme());
    }

    public String getAuthenticationScheme() {
        return SecurityContext.BASIC_AUTH;
    }
}

public class User {

    public String username;
    public String role;

    public User(String username, String role) {
        this.username = username;
        this.role = role;
    }
}

使用该过滤器的一切都很好,但是当它转到Web服务时

 @GET
 @RolesAllowed({"customRole"})
 @Path("/test")
 public String getByType(@Context HttpHeaders headers,@Context SecurityContext sc,
                                 @Context HttpServletRequest request) {



   return null;
 }

它到达webservice但是当我改变角色时,仍然到达同一个webservice。我如何在泽西岛提供不同的自定义角色?

2 个答案:

答案 0 :(得分:2)

使用Jersey 2,您只需注册RolesAllowedDynamicFeature并在web.xml中保护您的申请。比你不需要自定义SecurityContext实施。

有关详细信息,请参阅Jersey custom SecurityContext on EJB jax-rs resource

答案 1 :(得分:0)

尝试将注释放到类中。 我添加@PreMatching @Provider即可。 在这种情况下,似乎提供者注释是强制性的。

varybyparam

如果这不起作用,请尝试添加: @priority(Priorities.AUTHORIZATION)

此外,您需要启用角色和register RolesAllowedDynamicFeature或使用alternatives - check example 19.2