Я хочу реализовать пользовательскую авторизацию в моих службах 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
в качестве отправной точки, я смог узнать, какой метод будет вызван.Тем не менее, я до сих пор не понял, как определить, какие параметры будут фактически использоваться для вызова метода.
В верхней части моей головы я могу придумать два обходных пути:
- Метод-перехватчик с использованием Guice + Jersey.
- Код этой логики в
QueryStringCustomerInjectable
, но это кажется немного неаккуратным.Это был бы класс, делающий слишком много .
Тем не менее, я бы действительно хотел бы сделать это, используя только Джерси / JAX-RS.Я чувствую, что я так близко!
Идеи?Указатели?
Спасибо!