2

我有一个 Solr 服务器在码头上作为 web 应用程序运行。我现在想向码头添加一个自定义身份验证程序,以广告/删除可以访问 solr 搜索的用户。

用户发送一个令牌,该令牌需要由 3. 方服务器验证,然后才允许用户访问 solr 服务器。

如何拦截从码头内部对 solr 服务器的请求并为经过身份验证的用户进行某种会话管理?

有人为 tomcat 发布了一个类似的问题:implementing-custom-authentication-with-tomcat的答案是使用过滤器。有一些可用于码头的过滤器类,但它们与 tomcat 相似吗?我将如何部署自己的过滤器类?

是否有针对此类问题的教程?

4

1 回答 1

2

好吧,似乎没有人回答,所以我将开始逐步回答我自己的问题。

过滤器是解决我的问题的正确方法。它们不是特定于 tomcat 或 jetty 的东西,而是由 Java Servlet 规范 2.3 版标准化。因此,tomcat 或 jetty 或任何其他实现 Java Servlet 规范的网络服务器都应该运行过滤器。

作为过滤器用例的示例,这篇 oracle/java 文章列出了:“基于用户身份的身份验证阻止请求”。

这正是我想要做的。我将尝试使用过滤器并根据我的进度更新此答案,直到我发现问题已得到充分回答。

第 1 步,过滤器开发的准备工作
在开始编写自己的过滤器之前,您必须为 JavaEE 开发设置 IDE 或为构建工具编写所需的构建文件。有很多教程已经解释了这一点。例如: Eclipse + Tomcat Maven + 码头

第二步,编写最简单的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文件中,然后将它用于我在任何servlet服务器上运行的任何应用程序。可悲的是,它似乎不像那样工作。每个 webapp 都在自己的上下文中部署在您的服务器上,无法访问其他 webapps 的上下文(据我所知,至少在码头上)。例如,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 服务器。现在,您应该在http://localhost:8983/solr/.

现在您可以开始更换

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

doFilter方法中使用您自己的自定义身份验证。

于 2013-01-21T00:28:36.473 回答