Получение фактических значений параметров в Jersey ResourceFilterFactory - PullRequest
19 голосов
/ 10 июня 2011

Я хочу реализовать пользовательскую авторизацию в моих службах REST, используя Джерси.Эта пользовательская авторизация проверяет аннотации для методов, а также фактические параметры, которые получает метод.

Мой аннотированный метод jax-rs выглядит следующим образом:

@GET
@Path("customers")
@Requires(Role.CustomerManager)
public Customer getCustomer(@ParseFromQueryString @CheckPermission final Customer customer) {
    // ...
}

@ParseFromQueryString - это аннотация, котораяуказывает на Джерси (через поставщика инъекционных услуг) для отмены вызова Customer из строки запроса.Код для этого выглядит следующим образом:

public class QueryStringCustomerInjectable implements Injectable<Customer> {
  public Customer getValue() {
    final Customer customer = new Customer();
    // ... a UriInfo was injected using the @Context annotation
    // ... extract parameters from QueryString and use setters
    return customer;
  }
}

Аннотация @CheckPermission указывает моему пользовательскому авторизатору, что разрешения должны проверяться на клиенте.Некоторые пользователи имеют доступ к информации о некоторых клиентах.Точно так же аннотация @Requires играет роль, которую должен иметь вызывающий объект.Это не роли безопасности Java (Strings), а значения enum.

Используя Джерси ResourceDebuggingFilter в качестве отправной точки, я смог узнать, какой метод будет вызван.Тем не менее, я до сих пор не понял, как определить, какие параметры будут фактически использоваться для вызова метода.

В верхней части моей головы я могу придумать два обходных пути:

  1. Метод-перехватчик с использованием Guice + Jersey.
  2. Код этой логики в QueryStringCustomerInjectable, но это кажется немного неаккуратным.Это был бы класс, делающий слишком много .

Тем не менее, я бы действительно хотел бы сделать это, используя только Джерси / JAX-RS.Я чувствую, что я так близко!

Идеи?Указатели?

Спасибо!

Ответы [ 3 ]

1 голос
/ 29 апреля 2015

Вы должны использовать Filters или Interceptors для обработки всей информации о методе. см. Джерси-фильтр и перехватчики

0 голосов
/ 28 октября 2014

Почему бы не использовать свой собственный фильтр сервлетов, например,

public class YourFilter implements Filter {
  ...
  @Override
 public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain filterChain) throws IOException, ServletException {

    // HttpServletRequest httpReq = (HttpServletRequest) request;
    // HttpServletResponse httpResp = (HttpServletResponse) response;

    // HttpServletRequest httpReq = (HttpServletRequest) request;
    // HttpServletResponse httpResp = (HttpServletResponse) response;
    // ..... httpReq.getUserPrincipal();


    // then set what you need using ThreadLocal and use it inside your resource class

    // do not forget to call 
    filterChain.doFilter(request, response); // at the end of this method

 }

Последний шаг - это регистрация вашего фильтра сервлетов.Это делается с помощью web.xml

веб-приложения. Оно будет перехватывать ваши HTTP-запросы до вызова фактического кода внутри ресурса джерси.

0 голосов
/ 28 мая 2014

Для десериализации Заказчика вы можете внедрить javax.ws.rs.ext.ParamConverterProvider и зарегистрировать его на Джерси.Затем вы можете добавить его в свои методы с помощью @QueryParam («customer»).Это немного более гибко, поскольку вы можете использовать его также с аннотациями @BeanParam или @PathParam.

Затем вы можете использовать ContainerRequestFilter.Посмотрите в качестве ссылки, как Джерси делает Oauth1, например OAuth1ServerFilter .Следующее, что вы можете сделать, - это создать функцию, которая будет регистрировать вновь созданный фильтр (см. Oauth1ServerFeature - исходный код я сейчас не могу найти).Удачи!

...