我在我的应用程序中实现了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;
}
但现在我的问题是,该函数如何检索目录列表以跳过身份验证?
经过一段时间的研究,包括在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开发人员制作的原始解决方案,尽快开始工作。只要我没有,我就采用这种解决方法。