2016-10-06 3 views
0

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.

+0

Bumping ........ – Nico

Antwort

0

In Ordnung, also habe ich weiter gegraben und nach einer Nacht Schlaf dachte ich über etwas Neues auszuprobieren.

Da habe ich das Problem, bereits eine benutzerdefinierte securityFilter, die Waffel blockiert, um richtig zu funktionieren (auch mit Filter springen mit Dispatcher etc). Meine Augen erwischten etwas Interessantes.

Waffle setzen eine Kopfzeile mit dem Namen "WWW-Authenticate", also warum nicht in dieser Richtung versuchen. nach ein paar Stunden habe ich es funktioniert. Ich führe meinen eigenen NTLM-Handshake durch und lese aus dem Token, was ich brauche. get username from NTLM auth header half mir ziemlich viel zu verstehen, wie man meinen eigenen NTLM Handshake durchführt. Grundsätzlich habe ich den Quellcode mit Hilfe dieses Masterpeace NTLM Authentication Scheme for HTTP angepasst. Jetzt, nachdem ich gesehen habe, wie die Tokens und Pakete gebaut werden, habe ich es eingegraben und meinen Server dazu gezwungen, diese Authentifizierung anzufordern und dann, nachdem ich das NTLM V3-Token bekommen habe, was ich brauche, um mich einzuloggen.

Mit dieser Lösung kann ich meine Struktur behalten. Nur ein Filter, keine Wildfly-Anpassung, sondern nur reine Web-App-Logik, um es zum Laufen zu bringen.

Was wichtig ist, ist, dass ich noch die Browser konfigurieren muss, um der Website zu vertrauen, die ich browse, also bekomme ich nicht das Popup, das nach Anmeldeinformationen fragt.Dies kann hier Waffle Doc zu finden, aber ich hatte network.negotiate-auth.trusted-uris für Firefox hinzufügen und dann die Domäne hinzufügen (ex: http://localhost) das Popup zu verschwinden zu bekommen.

dachte, ich würde diese teilen, wenn jemand ein ähnliches Problem mit, dass die Umgebung hat.