使用 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 中提供不同的自定义角色?
【问题讨论】:
好的,我想我找到了解决方案,但应该以不同的方式添加尝试在类中添加注释。 对我来说,添加@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 传递到端点