Пользовательские роли @RolesAllowed в веб-службе Джерси с помощью ContainerRequestFilter - PullRequest
4 голосов
/ 07 марта 2012

Я создал фильтр с интерфейсом 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;
 }

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

Ответы [ 2 ]

2 голосов
/ 17 декабря 2014

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

См. Custom джерси SecurityContext на ресурсе EJB jax-rs для получения подробной информации об этом.

0 голосов
/ 15 ноября 2016

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

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

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

Дополнительно вам необходимо включить роли и зарегистрировать RolesAllowedDynamicFeature или использовать альтернативы - посмотрите пример 19.2

...