2013-12-14 4 views
2

Я разрабатываю API REST с помощью Jersey 2, и в настоящий момент я пытаюсь включить базовую аутентификацию с помощью аннотации, аналогичной @Auth, найденной в Dropwizard. СВведение в метод ресурсов в Джерси 2

@Path("hello") 
public class HelloResource { 
    @GET 
    @Produces("application/json") 
    public String hello(@Auth final Principal principal) { 
     return principal.getUsername(); 
    } 
} 

вводное ресурс вызов должен быть перехвачен некоторый код, выполняющего основную аутентификацию, используя учетные данные, передаваемые в заголовке запроса авторизации HTTP и на успех инъекционного принципала в метод основного параметра.

Я начал создавать резольвер @Auth, см. Ниже, но я не вижу, как я могу получить доступ к заголовку HTTP-запроса авторизации из этого?

@Singleton 
public class AuthResolver { 
    public static class AuthInjectionResolver extends ParamInjectionResolver<Auth> { 
     public AuthInjectionResolver() { 
      super(AuthValueFactoryProvider.class); 
     } 
    } 

    @Singleton 
    public static class AuthValueFactoryProvider extends AbstractValueFactoryProvider { 
     @Inject 
     public AuthValueFactoryProvider(final MultivaluedParameterExtractorProvider extractorProvider, final ServiceLocator injector) { 
      super(extractorProvider, injector, UNKNOWN); 
     } 

     @Override 
     protected Factory<?> createValueFactory(final Parameter parameter) { 
      final Class<?> classType = parameter.getRawType(); 
      return classType == null || !classType.equals(Principal.class) ? null : 
        new AbstractContainerRequestValueFactory<Principal>() { 
         @Override 
         public Principal provide() { 
          // Authentication? 
         } 
        }; 
     } 
    } 

    public static class Binder extends AbstractBinder { 
     @Override 
     protected void configure() { 
      bind(AuthValueFactoryProvider.class).to(ValueFactoryProvider.class).in(Singleton.class); 
      bind(AuthInjectionResolver.class).to(
        new TypeLiteral<InjectionResolver<Auth>>() { 
        } 
      ).in(Singleton.class); 
     } 
    } 
} 

Как подойти к этому? :)

ответ

0

Ах, в AbstractContainerRequestValueFactory<Principal> я могу добавить

@Context private ResourceContext context; 

и затем извлечь запрос HTTP, и это заголовки из там внутри метода обеспечения.

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