2016-08-15 8 views
0

私が行う必要があるもの: TLS(つまりhttps)を超えないHTTPリクエストを拒否する方法を理解する必要があります。理想的には、要求がhttpsを超えていない場合は、httpステータス404(見つからない)を返すことができます。Apache cxf/jaxrs以外のhttps要求を拒否する方法

私の実装は次のようになります。 Apache cxf/jaxrsを使用してRESTサービスを実装しています。 私は、SpringのIoCを使用してサービスを作成しています。

Springアプリケーションコンテキストファイルのサービス定義は次のようになります。

<jaxrs:server id="testSvc" address="/"> 
    <jaxrs:serviceBeans> 
     <ref bean="svcBean"/> 
    </jaxrs:serviceBeans>  
</jaxrs:server> 

サービスは、Tomcatの内部で実行されています。

単純なサーブレットフィルタまたはjax-rsフィルタ(たとえば、javax.ws.rs.container.ContainerRequestFilterを継承するもの)を使用することを考えています。

これを行うより良い方法はありますか?

答えて

1

tomcatはSSL/TLS上でのみ公開できますが、私はゲストではできません。したがって、SSLセッション中であるかどうかを検出できます。

//Tomcat 6 
String sslID = (String)request.getAttribute("javax.servlet.request.ssl_session"); 

//Tomcat 7 
String sslID = (String)request.getAttribute("javax.servlet.request.ssl_session_id"); 

が最後にリクエストパラメータにアクセスするにはCXFでContainerRequestFilterを設定tomcat SSL documentation

を参照してください

public class SSLFilter implements ContainerRequestFilter { 

    public void filter(ContainerRequestContext context) { 

     //get current httpservletRequest from CXFMessage 
     Message message = JAXRSUtils.getCurrentMessage(); 
     HttpServletRequest request = (HttpServletRequest) message.get(AbstractHTTPDestination.HTTP_REQUEST); 

     //Get SSL session ID 
     String sslID = (String)request.getAttribute("javax.servlet.request.ssl_session"); 

     // finally use context.abortWith(Response) if you need to block the request 
     if (sslId == null){ 
      Response response = Response.status(Response.Status.UNAUTHORIZED).build(); 
      context.abortWith(response); 
     } 
    } 

providerを追加し、必要に応じて応答を中止:要求、使用からSSLセッションIDにアクセスするにはあなたにサーバー

<bean id="sslFilter" class="SSLFilter"> 
<jaxrs:server id="testSvc" address="/"> 
    <jaxrs:providers> 
     <ref bean="sslFilter" /> 
    </jaxrs:providers> 
</jaxrs:server> 
+0

良い応答が、私の質問では、ContainerRequestFilterを*可能な*解決策として特定していますが、「これを行うより良い方法はありますか?」という質問をします。 サーブレットフィルタまたはContainerRquestFilter以外のソリューションを探しています。 – mangotang

+0

最も簡単な解決策は、tomcatまたはSSLプロキシでhttpプロトコルを無効にすることです。しかし、私はあなたが他のサービスのために必要と思った。 http/httpsを受け入れるには、適切な解決策がフィルタです。 J2EE標準フィルタでは、サーバごとにカスタマイズすることはできません。また、CXFインターセプタの使用を検討することもできますが、単純ではありません。このタイプのアクションでは、CXF3.0の 'ContextRequestFilter'が利用可能です(サービスメソッドが呼び出される前にメッセージを前処理しています)。 – pedrofb

+0

残念ながら私はCXF 2.2.12に固執しています。 ContextRequestFilterはそのバージョンには存在しません。だから、私はCXFインターセプタを使用しました。それは正常に動作しているようです。 – mangotang

関連する問題