我使用ContainerRequestFilter接口創建了一個過濾器,並嘗試分配返回用戶實體的自定義角色。在Jersey WebService中使用ContainerRequestFilter自定義@RolesAllowed角色
@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;
}
到達web服務,但是當我改變角色,仍得出同樣的web服務。我如何在澤西島提供不同的自定義角色?
好吧,我想我找到了解決辦法而應該是不同的方式 只需添加 com.sun.jersey.spi.container.ResourceFilters com.sun.jersey.api.container.filter.RolesAllowedResourceFilterFactory PARAM值> 濾波器到我的web.xml解決的問題。但是爲什麼我需要初始化另一個過濾器ContainerRequestFilters? –
erhan
2012-03-06 20:47:10
由於Jersey不支持開箱即用的@RolesAllowed。提到的過濾器增加了這種支持。順便說一句,你不應該返回400未經授權,這意味着不好的要求。請參閱HTTP狀態401。 – 2012-03-07 13:43:10