Аутентификация Wildfly 10 Windows

Я застрял на сервлете и фильтре безопасности для веб-приложения Java. поэтому я получил свой 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-и-активный-каталог

поэтому я пытаюсь получить доступ к этой части прямо здесь через фильтр 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-адреса, потому что наше приложение не работает без него, и тогда ничего не работает. но мне нужен специальный URL-адрес POST для моего WaffleSSOFilter, чтобы включить возможность аутентификации через вошедшего в систему пользователя Windows на удаленном компьютере, получающем доступ к веб-сайту.

Цель состоит в том, чтобы иметь страницу входа с обычной формой имени пользователя и пароля и иметь флажок для включения проверки подлинности Windows.

С этой настройкой я могу нормально войти в систему с именем пользователя и паролем. Приложение работает, пока что хорошо. Теперь, если я сделаю запрос POST на свой специальный URL-адрес для проверки аутентификации Windows, я получаю исключение java.lang.NullPointerException для предыдущего исходного кода точно при доступе к servletRequest.getUserPrincipal().toString()

Вопрос: Где моя ошибка в настройке фильтра или что не так с исходным кодом?

PS: Да, я настроил свои браузеры, чтобы включить запрос, как указано в ссылке во втором сообщении. PPS: когда я удаляю наш первый фильтр и перенаправляю все через вафельный фильтр, вход в систему работает, и я не получаю исключение NullPointerException, хотя приложение полностью сломано.


person Nico    schedule 06.10.2016    source источник
comment
натыкаясь........   -  person Nico    schedule 07.10.2016


Ответы (1)


Итак, я продолжил копать, и после ночи сна я подумал о том, чтобы попробовать что-то новое.

Поскольку у меня возникла проблема с уже имеющимся настраиваемым фильтром безопасности, который блокирует правильную работу вафли (даже при переходе фильтра с диспетчером и т. д.). Мои глаза уловили кое-что интересное.

Waffle установил заголовок с именем «WWW-Authenticate», так почему бы не попробовать в этом направлении. через пару часов у меня все заработало. Я выполняю свое собственное рукопожатие NTLM и считываю то, что мне нужно от токена. получить имя пользователя из заголовка аутентификации NTLM очень помог мне в понимание того, как выполнить собственное рукопожатие NTLM. По сути, я настроил найденный там исходный код с помощью этой masterpeace схемы аутентификации NTLM для HTTP< /а>. Теперь, увидев, как создаются токены и пакеты, я покопался в этом и заставил свой сервер запрашивать эту аутентификацию, а затем, получив токен NTLM V3, прочитал, что мне нужно для входа пользователя.

С этим решением я могу сохранить свою структуру. Только один фильтр, никакой индивидуальной настройки, а только чистая логика веб-приложения, чтобы заставить его работать.

Что важно, так это то, что мне все еще нужно настроить браузеры так, чтобы они доверяли веб-сайту, который я просматриваю, поэтому я не получаю всплывающее окно с запросом учетных данных. Это можно найти здесь Waffle Doc, но мне пришлось добавить network.negotiate-auth.trusted-uris для Firefox, а затем добавьте домен (например: http://localhost), чтобы всплывающее окно исчезло.

Просто подумал, что поделюсь этим, если у кого-то будет похожая проблема с этим окружением.

person Nico    schedule 07.10.2016