0

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 は発生しませんが、アプリケーションは完全に壊れています。

4

1 に答える 1

0

さて、私は掘り続け、一晩寝た後、何か新しいことに挑戦することを考えました.

ワッフルが正しく実行されるのをブロックするカスタム securityFilter が既にあるという問題が発生したため (ディスパッチャーなどでフィルター ジャンプしても)。私の目は面白いものを捉えました。

ワッフルは「WWW-Authenticate」という名前のヘッダーを設定したので、その方向で試してみませんか。数時間後、私はそれを機能させました。独自の NTLM ハンドシェイクを実行し、トークンから必要なものを読み取ります。 NTLM 認証ヘッダーからユーザー名を取得すると、独自の NTLM ハンドシェイクを実行する方法を理解するのに非常に役立ちました。基本的に、この masterpeace NTLM Authentication Scheme for HTTPの助けを借りて、そこにあるソース コードをカスタマイズしました。トークンとパッケージがどのように構築されているかを確認した後、サーバーに強制的にこの認証を要求させ、NTLM V3 トークンを取得した後、ユーザーのログインに必要なものを読み取りました。

このソリューションを使用すると、構造を維持できます。フィルターは 1 つだけで、wildfly のカスタマイズはありませんが、それを機能させるための純粋な Web アプリ ロジックのみです。

重要なのは、閲覧する Web サイトを信頼するようにブラウザーを構成する必要があるため、資格情報を求めるポップアップが表示されないことです。これはここWaffle Docにありますが、Firefox 用に追加してからnetwork.negotiate-auth.trusted-uris、ドメイン (例: http://localhost ) を追加してポップアップを非表示にする必要がありました。

誰かがその周辺で同様の問題を抱えている場合、これを共有すると思いました.

于 2016-10-07T11:50:22.397 に答える