2016-07-28 7 views
8

Ich versuche, Windows-Authentifizierung mit einer Drittanbieter-Anwendung mit GWT entwickelt zu arbeiten. Ich hosste die App mit Tomcat, auf einem Windows-Server. Ich greife über einen IIS-Proxy auf die Site zu (nach der Tomcat-Dokumentation installiert).Warum ist request.getRemoteUser() manchmal Tomcat Windows-Dienstkonto zurückgeben

Wenn ich ein .jsp der Webapp ändern, um "<% = request.getRemoteUser()%>" anzuzeigen, bekomme ich den Benutzernamen, für den ich hoppe, mein Windows-Konto.

Aber die Webapp authentifiziert mich mit dem Konto, auf dem ich den Tomcat Windows-Dienst mit auf dem Server installiert habe.

Im (dekompilierten) Quellcode der Webapp sehe ich einen Aufruf der exakt gleichen "request.getRemoteUser()", also frage ich mich, wo der Unterschied sein kann.

Hier sind die dekompilierten Klassen:

import javax.servlet.http.HttpServletRequest; 

public class RemoteUserLoginProvider 
    extends BaseRequestLoginProvider 
{ 
    public String extractLoginFromRequest(HttpServletRequest request) 
    { 
    return request.getRemoteUser(); 
    } 
} 

Und:

import com.google.inject.Inject; 
import com.google.inject.Provider; 
import javax.servlet.http.HttpServletRequest; 

public abstract class BaseRequestLoginProvider 
    implements Provider<String> 
{ 
    @Inject 
    private Provider<HttpServletRequest> requestProvider; 

    public abstract String extractLoginFromRequest(HttpServletRequest paramHttpServletRequest); 

    public String get() 
    { 
    HttpServletRequest request = (HttpServletRequest)this.requestProvider.get(); 
    String userlogin = extractLoginFromRequest(request); 

    return userlogin; 
    } 
} 

konnte mein Problem zu diesen Fehler auf Googles guice verknüpft werden: https://github.com/google/guice/issues/780?

Wenn ja, gibt es irgendwelche Arbeiten?

+0

Ich formulierte meine Frage hier: http://stackoverflow.com/questions/38664679/request-getremoteuser-returns-a-different-login-in-jsp-than-in-a-servlet-filt, nach zusätzlichen Tests die Möglichkeit auszuschließen, dass das Problem mit guice/gwt war. – Laloutre

Antwort

0

HttpServletRequest.getRemoteUser() gibt normalerweise nur den gleichen Wert wie die CGI REMOTE_USER Variable zurück, die der Benutzername von HTTP Basic Authentication ist. Es klingt, als ob Sie möchten, dass es ein anderer Wert ist, was bedeutet, dass etwas das Objekt HttpServletRequest verändert. Höchstwahrscheinlich wird dies durch einen Servlet-Filter erreicht.

Wenn das Guice Fehler der Schuldige ist, ist es einfach genug, um zu arbeiten: einfach sicher, dass GuiceFilter installiert ist nach was auch immer Filter die Anforderung authentifiziert und Modifizieren des HttpServletRequest Objekt.

Als allgemeine Faustregel halte ich eine Änderung der Anforderung nicht für eine gute Idee, gerade weil es so schwierig ist, zu debuggen, wenn etwas schief geht. Wenn Sie stattdessen einen @RequestScoped-Provider haben, der die gewünschten Werte aus der Anfrage extrahiert und die erforderliche Authentifizierung durchgeführt hat, können Sie stattdessen die Benutzerinformationen nach Abhängigkeitsinjektion konsumieren. Oder allgemeiner: Sie ziehen es immer vor, neue (vorzugsweise unveränderliche) Werte zu erstellen, anstatt bestehende Objekte zu mutieren. Dadurch wird der Kontrollfluss viel leichter nachvollziehbar.

Verwandte Themen