Java Web アプリケーションのサーブレットとセキュリティ フィルタで行き詰まりました。だから私は次のような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>
この小さな投稿に出くわしたため、このセットアップを取得しました: 同じURLマッピングを持つ複数のフィルター
そして、正しい方向に進むのに役立つこの投稿を見つけました: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;
}
私にとって難しいのは、最初のフィルター「com.company.xxx.xxx.xxx.SecurityFilter」がすべての URL に必要なことです。しかし、Web サイトにアクセスするリモート マシンでログインしている Windows ユーザーを認証する機能を有効にするには、WaffleSSOFilter 用の特別な POST URL が必要です。
目標は、通常のユーザー名とパスワードの形式でログイン ページを作成し、Windows 認証を有効にするチェックボックスを用意することです。
このセットアップでは、ユーザー名とパスワードで通常どおりログインできます。アプリケーションは機能しており、これまでのところ良好です。ここで、Windows 認証をテストするために特別な URL に POST 要求を行うと、以前のソース コードに正確にアクセスしたときに java.lang.NullPointerException が発生します。servletRequest.getUserPrincipal().toString()
質問:フィルターのセットアップのどこにエラーがありますか、またはソース コードの何が問題になっていますか?
PS: はい、2 番目の投稿のリンクに記載されているように、要求を有効にするようにブラウザーを構成しました。PPS: 最初のフィルターを削除し、waffle フィルターを介してすべてをルーティングすると、ログインは機能し、NullPointerException は発生しませんが、アプリケーションは完全に壊れています。