SPNEGO - 从身份验证检查中排除特定的URL / URL模式

问题描述 投票:0回答:1

我在我的应用程序中实现了Single Sign On。现在我得到了URL,我不想使用单点登录(例如,不受保护的web服务)。我怎么能这样做?是否支持SPNEGO init参数?

<display-name>myapp</display-name>
<welcome-file-list>
    <welcome-file>/faces/index.xhtml</welcome-file>
</welcome-file-list>
<error-page>
    <exception-type>java.lang.Exception</exception-type>
    <location>/faces/error.xhtml</location>
</error-page>
<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>prototype</param-value>
    </init-param>
    <load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

现在我想配置这样的东西:

<filter>
    <filter-name>SpnegoHttpFilter</filter-name>
    <filter-class>net.sourceforge.spnego.SpnegoHttpFilter</filter-class>
[...]
  <init-param>
   <param-name>excludePattern</param-name>
   <param-value>.*rest.*</param-value>
  </init-param>
</filter>

编辑:09/11/2018 01:35 PM

在SPNEGO源代码中,在SpnegoHttpFilter.java类中,我找到了我要查找的内容(包括注释):

   @Override
public void doFilter(final ServletRequest request, final ServletResponse response
    , final FilterChain chain) throws IOException, ServletException {

    final HttpServletRequest httpRequest = (HttpServletRequest) request;
    final SpnegoHttpServletResponse spnegoResponse = new SpnegoHttpServletResponse(
            (HttpServletResponse) response);

    // skip authentication if resource is in the list of directories to exclude
    if (exclude(httpRequest.getContextPath(), httpRequest.getServletPath())) {
        chain.doFilter(request, response);
        return;
    }

但现在我的问题是,该函数如何检索目录列表以跳过身份验证?

java filter spnego
1个回答
0
投票

经过一段时间的研究,包括在sourceforge上浏览文档论坛,我无法使SPNEGO跳过身份验证机制运行。似乎没有配置示例。我打开了一个SPNEGO sourceforce页面的问题,但是现在我实现了一个解决方法。

我拍了最后一批spnego。 (构建r9,下载here)。

在SpnegoHttpFilter类中,我创建了一个名为“excludePattern”的全局变量。

private String excludePattern = null;

在我的Web应用程序的web.xml中,我创建了一个新的init参数,如下所示:

<init-param> 
 <param-name>excludePattern</param-name> 
 <param-value>.*rest.*</param-value>
</init-param> 

在类SpnegoHttpFilter中,我需要像这样读取web.xml的参数:

this.excludePattern = filterConfig.getInitParameter("excludePattern");

后来,在SpnegoHttpFilter类中,我转到函数doFilter()并插入以下内容:

String url = httpRequest.getRequestURL().toString();
if (Pattern.matches(this.excludePattern, url)) {
   chain.doFilter(request, response);
   LOGGER.fine("Excluded URL requested");
   return;
}

现在,代码根据请求的URL检查给定的模式。如果pattern是URL的一部分,则将跳过身份验证。

我希望我能做出由spnego开发人员制作的原始解决方案,尽快开始工作。只要我没有,我就采用这种解决方法。

© www.soinside.com 2019 - 2024. All rights reserved.