2

Jetty で Web アプリケーションとして実行されている Solr サーバーがあります。カスタム認証手順を jetty に追加して、solr 検索にアクセスできるユーザーを広告/削除したいと考えています。

ユーザーは、ユーザーが solr サーバーへのアクセスを許可される前に、サードパーティ サーバーによって検証される必要があるトークンを送信します。

jetty 内から solr サーバーへのリクエストを傍受し、認証されたユーザーに対して何らかのセッション管理を行うにはどうすればよいですか?

Tomcat についても同様の質問が投稿されまし。jetty で使用できるフィルター クラスがいくつかありますが、それらは tomcat に似ていますか? また、独自のフィルター クラスをデプロイするにはどうすればよいですか?

この種の問題に対するチュートリアルはありますか?

4

1 に答える 1

2

誰も答えないようなので、自分の質問に段階的に答え始めます。

フィルターは私の問題に対する正しいアプローチです。これらは tomcat や jetty 固有のものではなく、Java Servlet 仕様バージョン 2.3 によって標準化されています。したがって、Tomcat、Jetty、または Java サーブレット仕様を実装するその他の Web サーバーの両方でフィルターを実行する必要があります。

フィルタのユース ケースの例として、この oracle/java の記事に「ユーザー ID に基づく認証ブロック リクエスト」がリストされています。

これはまさに私がやりたいことです。質問が十分に回答されていることがわかるまで、フィルターを使用してこの回答を更新していきます。

ステップ 1、フィルター開発の準備
独自のフィルターの作成を開始する前に、JavaEE 開発用に IDE をセットアップするか、ビルド ツールに必要なビルド ファイルを作成する必要があります。これについては、すでに多くのチュートリアルが説明されています。例: Eclipse + Tomcat Maven + Jetty

ステップ 2、最も単純な Hello World フィルターを作成する

package hello.world.filter;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class HelloWorldFilter implements Filter {

    public void init(FilterConfig fConfig) throws ServletException {
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {        
        PrintWriter out = response.getWriter();
        out.print("hello World");
    }

    public void destroy() {
    }

}

ステップ 3、実行中の solr サーバーにフィルターをデプロイする
このステップは、思ったほど簡単ではありません。認証フィルターを war ファイルにパッケージ化して、任意のサーブレット サーバーで実行している任意のアプリケーションに使用できると考えました。残念ながら、そのようには機能しないようです。すべての webapp は独自のコンテキストでサーバーにデプロイされ、他の webapps のコンテキストにアクセスできません (少なくとも私が知る限り、jetty では)。たとえば、Solr 自体は webapp であり、 context がありますhttp://localhost:8983/solr/。コンテキストで webapp をデプロイした場合でも、http://localhost:8983/*これhttp://localhost:8983/solr/*が solr にまったく影響を与えず、誰もが solr サーバーにアクセスできるようになります。

解決策は、フィルターを solr webapp に統合することです。そのためには、最初に HelloWorldFilter.class を jar ファイルにパッケージ化する必要があります。次に、solr サーバーがあるディレクトリに移動し、solr.war ファイルを解凍します。(標準インストールでは、これは通常solr-4.1.0/example/webappsになります)。ここで、solr webapp のコンテキスト ファイルを変更する必要があります。これは、solr.war にパッケージ化されなくなり、代わりにディレクトリで構成されているためです。solr-4.1.0/example/contextsに移動し、 solr.xmlを開きます。<Set name="war"><SystemProperty name="jetty.home"/>/webapps/solr.war</Set>行を に変更し<Set name="war"><SystemProperty name="jetty.home"/>/webapps/solr</Set>ます。これで、フィルターを実際にデプロイできます。jar ファイルをフォルダーsolr-4.1.0/example/webapps/solr/WEB-INF/libにコピーします。. 最後のステップとして、solr の起動中にフィルターをデプロイする必要があることを solr に知らせる必要があります。これを行うには、 solr-4.1.0/example/webapps/solr/WEB-INF/web.xmlを開き、次の行を追加します。

   <filter>
    <filter-name>HelloWorldFilter</filter-name>
    <filter-class>hello.world.filter.HelloWorldFilter</filter-class>
  </filter> 

行の前に

<filter>
    <filter-name>SolrRequestFilter</filter-name>
    ...

また、広告:

<filter-mapping>
  <filter-name>HelloWorldFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

ファイル内の他のフィルター マッピングの前。

すべてを安全にして、solr サーバーを再起動します。solr Web インターフェイスの代わりに、 の後に任意のコンテキストで「hello world」が表示されるはずhttp://localhost:8983/solr/です。

これで交換を開始できます

PrintWriter out = response.getWriter();
out.print("hello World");

doFilterメソッド内で独自のカスタム認証を使用します。

于 2013-01-21T00:28:36.473 に答える