Ich habe auf Servlet und Sicherheitsfilter für eine Java-Web-Anwendung stecken. so habe ich meine web.xml, die wie folgt aussieht:Wildfly 10 Windows Authentifizierung
<!-- <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>
ich dieses Setup bekam, weil ich auf diesen kleinen Beitrag gestolpert: Multiple filters with same url mapping
und dann fand ich diesen Beitrag, die ich zu bekommen geholfen die richtige Richtung: java-sso-with-wildfly-8-java-1-8-0-45-and-active-directory
Also versuche ich diesen Teil hier durch den Filter WaffleSSOFilter zu erreichen.
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;
}
Der schwierige Teil auf das für mich ist, dass der erste Filter „com.company.xxx.xxx.xxx.SecurityFilter“ auf jede URL benötigt wird, weil unsere Anwendung ohne es kaputt ist und nichts funktioniert dann. aber ich brauche eine spezielle POST-URL für meinen WaffleSSOFilter, um die Authentifizierung über den angemeldeten Windows-Benutzer auf dem Remote-Computer, der auf die Website zugreift, zu ermöglichen.
Ziel ist es, die Login-Seite mit dem normalen Benutzernamen und Passwort-Formular zu haben und ein Kontrollkästchen, um die Windows-Authentifizierung zu aktivieren.
Mit diesem Setup kann ich mich normalerweise mit Benutzername und Passwort anmelden. Die Anwendung funktioniert, was bisher gut ist. Nun, wenn ich eine POST-Anfrage an meine spezielle URL, um die Windows-Authentifizierung zu testen, erhalte ich eine java.lang.NullPointerException auf der vorherige Quellcode excactly bei Zugriff auf servletRequest.getUserPrincipal().toString()
Frage: Wo ist mein Fehler im Filter Setup oder was ist falsch mit dem Quellcode?
PS: Ja, ich habe meinen Browser so konfiguriert, dass die Anfrage wie im Link auf dem zweiten Post erwähnt aktiviert wird. PPS: Wenn ich unseren ersten Filter entferne und alles durch den Waffle-Filter route, funktioniert die Anmeldung und ich bekomme keine NullPointerException, die Anwendung ist jedoch komplett kaputt.
Bumping ........ – Nico