Wildfly 10 Windows身份验证

时间:2016-10-06 06:29:11

标签: java authentication single-sign-on wildfly waffle

我遇到了java web应用程序的servlet和安全过滤器。 所以我得到了我的web.xml,如下所示:

<!-- <distributable/> -->

<filter>
<filter-name>com.company.xxx.xxx.xxx.SecurityFilter</filter-name>
<filter-class>com.company.xxx.xxx.xxx.SecurityFilter</filter-class>
</filter>

<filter>
<filter-name>WaffleSSOFilter</filter-name>
<filter-class>waffle.servlet.NegotiateSecurityFilter</filter-class>
<init-param>
  <param-name>securityFilterProviders</param-name>
  <param-value>
      waffle.servlet.spi.NegotiateSecurityFilterProvider
  </param-value>
 </init-param>
 <init-param>
  <param-name>allowGuestLogin</param-name>
  <param-value>false</param-value>
 </init-param>
 <init-param>
  <param-name>waffle.servlet.spi.NegotiateSecurityFilterProvider/protocols</param-name>
  <param-value>
      Negotiate
  </param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>com.company.xxx.xxx.xxx.SecurityFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<filter-mapping>
<filter-name>WaffleSSOFilter</filter-name>
<url-pattern>/xxx/xxx/xxx/windowsLogin</url-pattern>
</filter-mapping>

<!-- Enabling it disables access to App from other computers -->
<context-param>
<param-name>org.jboss.weld.development</param-name>
<param-value>false</param-value>
</context-param>

<servlet-mapping>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<url-pattern>/xxx/*</url-pattern>
</servlet-mapping>

</web-app>

我得到了这个设置因为我偶然发现了这个小帖子: Multiple filters with same url mapping

然后我发现这篇文章帮助我找到了正确的方向:java-sso-with-wildfly-8-java-1-8-0-45-and-active-directory

所以我尝试通过过滤器WaffleSSOFilter访问此部分。

public String getUserName( HttpServletRequest servletRequest )
  {
    Enumeration<String> headerNames = servletRequest.getHeaderNames();
    while ( headerNames.hasMoreElements() )
    {
      String headerName = headerNames.nextElement();
      String headerValue = servletRequest.getHeader( headerName );
      log.info( "Header Name:" + headerName + " " + headerValue );
    }
    String remotePrincipal = servletRequest.getRemoteUser();
    log.info( "REMOTE USER: " + remotePrincipal );
    log.info( "PRINCIPAL: " + servletRequest.getUserPrincipal().toString() );
    return remotePrincipal;
  }

对我而言,困难的部分是每个URL都需要第一个过滤器“com.company.xxx.xxx.xxx.SecurityFilter”,因为我们的应用程序在没有它的情况下被破坏,然后什么都不起作用。但我需要为我的WaffleSSOFilter提供一个特殊的POST URL,以便能够通过访问该网站的远程计算机上登录的Windows用户进行身份验证。

目标是让登录页面具有正常的用户名和密码形式,并有一个复选框以启用Windows身份验证。

通过此设置,我可以使用用户名和密码正常登录。应用程序正在运行,到目前为止这是好的。现在,如果我对我的特殊URL发出POST请求来测试windows身份验证,我会在访问servletRequest.getUserPrincipal().toString()

时对前一个源代码进行java.lang.NullPointerException。

问题:我在过滤器设置中的错误在哪里或源代码有什么问题?

PS:是的我配置了我的浏览器以启用第二篇帖子中链接中提到的请求。 PPS:当我删除我们的第一个过滤器并通过华夫饼过滤器路由一切时登录工作,我没有得到NullPointerException,但应用程序完全被破坏了。

1 个答案:

答案 0 :(得分:0)

好吧,所以我一直在挖掘,经过一夜的睡眠,我想到尝试一些新东西。

因为我遇到了已经有一个自定义securityFilter的问题,它阻止了waffle正确执行(即使过滤器与调度程序一起跳转等)。 我的眼睛抓住了一些有趣的东西。

Waffle设置了一个名为&#34; WWW-Authenticate&#34;的标题,所以为什么不尝试那个方向。几个小时后我开始工作了。我正在执行自己的NTLM握手,并从令牌中读出我需要的内容。 get username from NTLM auth header帮助我了解如何执行自己的NTLM握手。基本上我在这个主要领域NTLM Authentication Scheme for HTTP的帮助下定制了那里找到的源代码。现在看了如何构建令牌和包后,我深入研究并强制我的服务器请求此身份验证,然后在获取NTLM V3令牌后,读出我需要登录用户的内容。

通过这个解决方案,我可以保留我的结构。只有一个过滤器,没有野生动态定制,只有纯粹的Web应用程序逻辑才能使其正常工作。

重要的是,我仍然需要配置浏览器以信任我浏览的网站,因此我不会让弹出窗口要求提供凭据。这可以在Waffle Doc找到,但我必须为firefox添加network.negotiate-auth.trusted-uris,然后添加域名(例如:http://localhost)以使弹出窗口消失。

如果有人遇到类似的问题,我想会分享这个。