このチュートリアルで説明されているように、認証/承認メカニズムを使用してRESTサービスを構築しています:http : //howtodoinjava.com/2013/06/26/jax-rs-resteasy-basic-authentication-and-authorization-tutorial/
基本的には、PreProcessInterceptorインターフェースを使用して、ターゲットメソッドをスキャンし(javax.annotation.securityパッケージから)、そのメソッドにアクセスするために必要な役割を記述します。ここでのオーセンティケーターはインターセプターであるため、必要に応じて401(無許可)を返し、ターゲットメソッドの呼び出しをキャンセルできます。
ここでの問題は、org.jboss.resteasy.spi.interception.PreProcessInterceptorインターフェースが現在のRestEasyバージョン(3.0.1)で非推奨になっていて、標準のJAX-RSインターフェースで同じ動作を実装しようとすると問題が発生することです。
javax.ws.rs.ext.ReaderInterceptorインターフェースを使用して、呼び出しをインターセプトしています。しかし、どういうわけかサーバーは決してそれを呼び出さない:インターセプターは単に無視される。
以前のPreProcessInterceptorで行ったのと同じ方法でインターセプター/リソースを登録し、同じ@Providerおよび@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...
}
}
この問題を解決するにはどうすればよいですか?
ありがとうございました。
RESTEasy 3.xxはJAX-RS 2.0仕様に準拠しています。
あなたがやろうとしていることは、(おそらくより良い)次のことで達成できます:
@Provider
public class SecurityInterceptor
implements javax.ws.rs.container.ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext requestContext){
if (not_authenticated){ requestContext.abortWith(response)};
}
}
ReaderInterceptor
は、基盤MessageBodyReader.readFrom
がアプリケーションコードからではなく、標準のJAX-RSパイプラインによって呼び出された場合にのみ呼び出されるためです。
ただし、インターセプターが呼び出されない理由@ServerInterceptor
は、RESTEasy拡張であるアノテーションにある可能性があります。
仕様は、6.5.2で、インターセプターがアノテーションで@Provider
注釈されていない限りグローバルに登録されていると述べていますが、ResEASYインターセプターが呼び出されていないように明示的に登録されていない場合に処理できる@NameBinding
かどうかはわかりませんRESTEasy
@ServerInterceptor
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加