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

Posted

技术标签:

【中文标题】使用 ContainerRequestFilter 在 Jersey WebService 中自定义 @RolesAllowed 角色【英文标题】:Custom @RolesAllowed roles in Jersey WebService with ContainerRequestFilter 【发布时间】:2012-03-24 09:01:06 【问题描述】:

我使用 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;
    

这个过滤器一切正常,但是当它进入网络服务时

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



   return null;
 

它到达了网络服务,但是当我改变角色时,仍然到达了相同的网络服务。如何在 Jersey 中提供不同的自定义角色?

【问题讨论】:

好的,我想我找到了解决方案,但应该以不同的方式添加 com.sun.jersey.spi.container.ResourceFilterscom.sun.jersey.api.container.filter.RolesAllowedResourceFilterFactory 过滤到我的 web.xml 解决的问题。但是为什么我需要再初始化一个过滤器 ContainerRequestFilters ? 因为 Jersey 不支持开箱即用的 @RolesAllowed。提到的过滤器增加了这种支持。顺便说一句,你不应该为未授权返回 400,这意味着错误的请求。请参阅 HTTP 状态 401。 【参考方案1】:

尝试在类中添加注释。 对我来说,添加@PreMatching 和@Provider 可以。 在这种情况下,Provider 注释似乎是强制性的。

@PreMatching
@Provider
public class RequestFilter implements ContainerRequestFilter 
   .....

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

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

【讨论】:

【参考方案2】:

使用 Jersey 2,您只需注册 RolesAllowedDynamicFeature 并在 web.xml 中保护您的应用程序。比您不需要自定义 SecurityContext 实现。

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

【讨论】:

以上是关于使用 ContainerRequestFilter 在 Jersey WebService 中自定义 @RolesAllowed 角色的主要内容,如果未能解决你的问题,请参考以下文章

如何将对象从 ContainerRequestFilter 传递到资源

Jersey ContainerRequestFilter 未触发

使用JAX-RS resteasy和ContainerRequestFilter / ContainerResponseFilter记录请求

Jersey:将值从 ContainerRequestFilter 传递到端点

ContainerRequestFilter ContainerResponseFilter 没有被调用

Jersey2.0 中ContainerRequestFilter的使用 无法拦截 求助