2012-03-06 4 views
4

Я создал фильтр с интерфейсом ContainerRequestFilter и попытался назначить настраиваемые роли, возвращающие пользовательский объект.Custom @RolesAllowed роли в Jersey WebService с 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; 
} 

он достигает WebService, но когда я изменить роль, по-прежнему достигла того же веб-сервиса. Как я могу предоставить различные пользовательские роли в Джерси?

+4

Хорошо я думаю, что я нашел решение но должен быть другой способ просто добавить com.sun.jersey.spi.container.ResourceFilters com.sun.jersey.api.container.filter.RolesAllowedResourceFilterFactory фильтр моей web.xml решаемой задачи. Но почему мне нужно инициализировать еще один фильтр else ContainerRequestFilters? – erhan

+2

Потому что Джерси не поддерживает @RolesAllowed из коробки. Упомянутый фильтр добавляет эту поддержку. И BTW, вы не должны возвращать 400 для несанкционированного доступа, это означает «плохой запрос». См. Статус HTTP 401. –

ответ

2

Используя Jersey 2, вы можете просто зарегистрировать RolesAllowedDynamicFeature и защитить свое приложение от web.xml. Чем вам не нужна обычная реализация SecurityContext.

Подробнее об этом см. Jersey custom SecurityContext on EJB jax-rs resource.

0

Попробуйте поместить аннотацию в класс. Для меня добавлено @PreMatching с @Provider работ. Кажется, что аннотация поставщика является обязательной в этом случае.

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

Если это не работает, попробуйте добавить: @Priority (Priorities.AUTHORIZATION)

Кроме того, вы должны позволяет роли и register RolesAllowedDynamicFeature или использовать alternatives - check example 19.2

Смежные вопросы