2013-07-11 14 views
27
このチュートリアルで説明したように、私は認証/認可メカニズムを使用してRESTサービスを構築しています

は:http://howtodoinjava.com/2013/06/26/jax-rs-resteasy-basic-authentication-and-authorization-tutorial/Resteasy 3.X PreProcessInterceptorの適切な置き換えは何ですか?

は、基本的にはアクセスに必要なロールを記述する(javax.annotation.securityパッケージから)注釈のためのターゲット・メソッドをスキャンするPreProcessInterceptorインターフェースを使用していますその方法。ここでのオーセンティケータはインターセプタであるため、必要に応じて401(無許可)を返すように、ターゲットメソッドの呼び出しを取り消すことができます。

ここでの問題は、現在のRestEasyバージョン(3.0.1)ではインターフェイスorg.jboss.resteasy.spi.interception.PreProcessInterceptorが廃止予定であり、標準と同じ動作を実装しようとすると問題が発生していますJAX-RSインターフェイス

私はjavax.ws.rs.ext.ReaderInterceptorインターフェイスを使用して呼び出しを代行しています。しかし、どういうわけかサーバーは決してそれを呼びません。インターセプタは無視されます。

私はかつてPreProcessInterceptorで行ったのと同じ方法インターセプタ/リソースの登録、および同じ@Providerと@ServerInterceptor注釈使用しています:

サーバアプリケーション:

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... 
    } 
} 

この問題を解決する方法についての洞察はありますか?

ありがとうございます。

+2

完全な例を別の投稿で更新しました:http://howtodoinjava.com/2013/07/25/jax-rs-2-0-resteasy-3-0-2-final-security-tutorial/ – lokesh

答えて

25

RESTEasy 3.x.xは、JAX-RS 2.0仕様に準拠しています。 ReaderInterceptorは、基礎となるMessageBodyReader.readFromは、アプリケーションコードをfromtheない、標準のJAX-RSのパイプラインによって呼び出された場合にのみ呼び出されるので、

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

:で(多分、より良い)達成することができる何をしようとしている

インターセプタが呼び出されない理由は、RESTEasy拡張である@ServerInterceptor注釈です。

インターセプタは@Provider@NameBindingアノテーションで注釈されている場合を除き世界的に、登録されているが、RestEASY Interceptor Not Being Calledに示すように、それが明示的に登録されていない場合RESTEasy@ServerInterceptorを扱うことができる場合、私は知らない§6.5.2でスペック状態

+0

ContainerRequestFilterを使用して、ターゲットメソッドのアノテーションを取得するにはどうすればよいですか?フィルタ/インターセプタは、ユーザロールに基づいて、呼び出しを適切に許可または拒否することを知る必要があります。 –

+0

'ContainerRequestFilter.getUriInfo()。getMatchedResources()'は、一致したリソースオブジェクトのリストを返します。ここで実際の呼び出されたメソッドに一致する注釈を解析できます –

+1

'requestContext.getUriInfo()。getMatchedResources()'を意味すると思います。とにかく、私はターゲット 'java.lang.reflect.Method'に直接アクセスすることができないので、このメソッドは以前の' PreProcessInterceptor'のように使い方が簡単ではありません。しかし、問題を解決するので、私は答えを受け入れたものとしてマークします。 –

4

あなたは(あなたがAcceptedByMethodを実装することによって得ることができるようにするために使用のような)基礎となるjava.lang.reflect.Methodへのアクセスを取得する必要がある場合は、以下の操作を行うことができます

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

requestContextからhttpRequestを取得するのはどうですか?私は、httpRequestからInputStreamを読み込む必要があります。どのようにそれを行うには?またはそこに私はcontainerrequestcontextからInputStreamを得ることができますか? – arunsankarkk

+0

methodInvokerからnull参照を取得していますが、理由はわかりません。 –

2

私もUへのアクセスを取得したいですjava.lang.reflect.Methodをネーミングし、Resteasy 3.0.8でmtpettypの答えを試しましたが、getProperty呼び出しでnullが返されました。また、私はこれをまったく影響を受けないと信じていますが、私は春とresteasy-springも使用しています。

あなたが私の状況に遭遇し、ポストマッチングContainerRequestFilterを実装している場合(実際に一致するリソースメソッドを取得する必要がある場合)、実際にContainerRequestContextを実装にキャストすることができますResteasyはポストマッチのシナリオ。 PostMatchContainerRequestContextには、ResourceMethodInvokerへの参照があります。

public void filter(ContainerRequestContext context) throws IOException { 
    PostMatchContainerRequestContext pmContext = (PostMatchContainerRequestContext) context; 

    Method method = pmContext.getResourceMethod().getMethod(); 

    /* rest of code here */ 
} 
関連する問題