我被困在 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 身份验证,我会在访问之前的源代码时得到 java.lang.NullPointerExceptionservletRequest.getUserPrincipal().toString()
问题:我在过滤器设置中的错误在哪里或源代码有什么问题?
PS:是的,我将浏览器配置为启用第二篇文章链接中提到的请求。PPS:当我删除我们的第一个过滤器并通过华夫饼过滤器路由所有内容时,登录工作并且我没有收到 NullPointerException,但应用程序完全损坏了。