Я застрял на сервлете и фильтре безопасности для веб-приложения 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, хотя приложение полностью сломано.