2013-07-11 17 views
27

buduję usługi odpoczynek przy użyciu mechanizmu uwierzytelniania/autoryzacji w sposób opisany w tym poradniku: http://howtodoinjava.com/2013/06/26/jax-rs-resteasy-basic-authentication-and-authorization-tutorial/Jakie jest właściwe zastąpienie urządzenia PreeConInterceptor Resteasy 3.X?

Zasadniczo wykorzystuje interfejs PreProcessInterceptor skanować metodę docelową dla adnotacji (z opakowaniem) javax.annotation.security opisujących wymaganych ról dostępu ta metoda. Jako że wystawca uwierzytelnienia jest tutaj przechwytywaczem, może anulować wywołanie metody docelowej, zwracając 401 (nieautoryzowane), jeśli jest to konieczne.

Problem polega na tym, że interfejs org.jboss.resteasy.spi.interception.PreProcessInterceptor jest przestarzały w aktualnej wersji programu RestEasy (3.0.1) i mam problemy z próbą zaimplementowania tego samego zachowania w standardzie Interfejsy JAX-RS.

Używam interfejsu javax.ws.rs.ext.ReaderInterceptor do przechwytywania połączenia. Ale jakoś serwer nigdy tego nie nazywa: przechwytywacz jest po prostu ignorowany.

mam rejestrację przechwytujących/zasobów w taki sam sposób jak ja z byłym PreProcessInterceptor i przy użyciu tego samego @Provider i adnotacje @ServerInterceptor:

ServerApplication:

public class ServerApplication extends javax.ws.rs.core.Application { 

    private final HashSet<Object> singletons = new LinkedHashSet<Object>(); 

    public ServerApplication() { 
     singletons.add(new SecurityInterceptor()); 
     singletons.add(...); //add each of my rest resources 
    } 

    @Override 
    public Set<Class<?>> getClasses() { 
     HashSet<Class<?>> set = new HashSet<Class<?>>(); 
     return set; 
    } 

    @Override 
    public Set<Object> getSingletons() { 
     return singletons; 
    } 
} 

SecurityInterceptor:

@Provider 
@ServerInterceptor 
public class SecurityInterceptor implements javax.ws.rs.ext.ReaderInterceptor { 
    @Override 
    public Object aroundReadFrom(ReaderInterceptorContext context){ 
      //code that is never called... so lonely here... 
    } 
} 

Wszelkie informacje o tym, jak mogę rozwiązać ten problem?

Dziękuję.

+2

Zaktualizowano pełny przykład w innym poście: http://howtodoinjava.com/2013/07/25/jax-rs-2-0-resteasy-3-0-2-final-security-tutorial/ – lokesh

Odpowiedz

25

RESTEasy 3.x.x jest zgodny ze specyfikacją JAX-RS 2.0.

Co próbujesz zrobić mogłoby być osiągnięte (może lepiej) z:

@Provider 
public class SecurityInterceptor 
     implements javax.ws.rs.container.ContainerRequestFilter { 
    @Override 
    public void filter(ContainerRequestContext requestContext){ 
     if (not_authenticated){ requestContext.abortWith(response)}; 
    } 
} 

od ReaderInterceptor jest wywoływana tylko wtedy, gdy instrumentem bazowym MessageBodyReader.readFrom nazywany jest przez standardową JAX-RS rurociągu, nie fromthe kodu aplikacji .

Powodem, dla którego przechwytywacz nie jest wywoływany, może być adnotacja @ServerInterceptor, która jest rozszerzeniem RESTEasy.

spec Zjednoczonych na §6.5.2 że Interceptor jest globalnie zarejestrowane, chyba że @Provider jest odnotowany z @NameBinding adnotacji, ale nie wiem, czy RESTEasy może obsługiwać @ServerInterceptor jeśli nie jest to wyraźnie zarejestrowany, jak pokazano na RestEASY Interceptor Not Being Called

+0

Jak korzystać z narzędzia ContainerRequestFilter, aby uzyskać adnotacje dotyczące metody docelowej? Filtr/przechwytywacz musi to wiedzieć, aby poprawnie zezwalać lub odmawiać wywołania, na podstawie ról użytkownika. –

+0

'ContainerRequestFilter.getUriInfo(). GetMatchedResources()' zwraca listę dopasowanych obiektów zasobów. Tam możesz parsować adnotacje pasujące do rzeczywistych nazwanych metod. –

+1

Myślę, że chodziło Ci o 'requestContext.getUriInfo(). GetMatchedResources()'. W każdym razie ta metoda nie jest tak łatwa w użyciu jak w poprzednim 'PreProcessInterceptor', ponieważ nie mam bezpośredniego dostępu do celu' java.lang.reflect.Method'. Ale zaznaczę odpowiedź jako zaakceptowaną, ponieważ rozwiązuje ona problem. –

4

Jeśli chcesz uzyskać dostęp do podstawowych java.lang.reflect.Method (jak dawniej, aby móc uzyskać poprzez wdrożenie AcceptedByMethod), można wykonać następujące czynności:

ResourceMethodInvoker methodInvoker = (ResourceMethodInvoker) 
      requestContext.getProperty("org.jboss.resteasy.core.ResourceMethodInvoker"); 
Method method = methodInvoker.getMethod(); 
+1

Co powiesz na pobranie httpRequest z requestContext. Mam wymóg odczytu InputStream z httpRequest. jak to zrobić? Lub jest sposobem, w jaki sposób można uzyskać InputStream z containerrequestcontext? – arunsankarkk

+0

Otrzymuję referencję null z metodyInvoker, nie wiem dlaczego. –

2

chciałem też, aby uzyskać dostęp do U nderlying java.lang.reflect.Method i wypróbował odpowiedź mtpettyp za pomocą Resteasy 3.0.8, ale to zwracało wartość null w wywołaniu getProperty. Używam też sprężyny i sprężyny relaksacyjnej, chociaż nie uważam, że powinno to mieć wpływ na to.

Jeśli natkniesz się na moją sytuację i implementujesz Post Matching ContainerRequestFilter (musisz wiedzieć, jeśli spodziewałeś się uzyskać dopasowaną metodę zasobów), to możesz rzucić ContainerRequestContext do implementacji Resteasy dla Posta Dopasuj scenariusz. Numer PostMatchContainerRequestContext zawiera odwołanie do ResourceMethodInvoker.

Powiązane problemy