我使用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。我如何在泽西岛提供不同的自定义角色?
答案 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