2016-07-28 40 views
8

Próbuję uzyskać uwierzytelnianie systemu Windows w celu pracy z aplikacją innej firmy opracowaną z GWT. Hostuję aplikację z tomcat na serwerze Windows. Uzyskuję dostęp do witryny za pośrednictwem serwera proxy IIS (zainstalowanego zgodnie z dokumentacją tomcat).Dlaczego request.getRemoteUser() zwraca czasami konto usługi tomcat windows

Jeśli zmodyfikuję .jsp na webappie, aby wyświetlić "<% = request.getRemoteUser()%>", otrzymuję nazwę użytkownika, do której skakałem, moje konto Windows.

Ale aplikacja internetowa uwierzytelnia mnie za pomocą konta, na którym zainstalowałem usługę Windows Tomcat na serwerze.

W (zdekompilowanym) kodzie źródłowym aplikacji widzę wywołanie dokładnie tego samego "request.getRemoteUser()", więc zastanawiam się, gdzie może być różnica.

Oto dekompilowana klas:

import javax.servlet.http.HttpServletRequest; 

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

I:

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; 
    } 
} 

Może mój problem jest związany z tym błędem na google za Guice: https://github.com/google/guice/issues/780?

Jeśli tak, czy jest jakieś obejście?

+0

Przeformułowałem moje pytanie tutaj: http://stackoverflow.com/questions/38664679/request-getremoteuser-returns-a-different-login-in-jsp-than-in-a-servlet-filt, po dodatkowych testach aby wykluczyć możliwość, że problem dotyczył guice/gwt. – Laloutre

Odpowiedz

0

HttpServletRequest.getRemoteUser() zwykle po prostu zwraca tę samą wartość, co zmienna CGI REMOTE_USER, która jest nazwą użytkownika z podstawowego uwierzytelniania HTTP. Wygląda na to, że chcesz mieć inną wartość, co oznacza, że ​​coś modyfikuje obiekt HttpServletRequest. Najprawdopodobniej jest to realizowane przez filtr serwletów.

Jeśli Guice bug jest winowajcą, to jest dość łatwe do obejścia: po prostu upewnić się, że jest zainstalowany GuiceFilter po cokolwiek Filtr uwierzytelnia żądanie i modyfikowania obiektu HttpServletRequest.

Generalnie nie sądzę, że modyfikowanie takiego żądania jest dobrym pomysłem, właśnie dlatego, że tak trudno jest debugować, gdy coś idzie nie tak. Jeśli zamiast tego masz dostawcę @RequestScoped, który wyodrębnił żądane wartości z żądania i wykonał dowolne uwierzytelnienie, możesz zamiast tego użyć informacji o użytkowniku przez wstrzyknięcie zależności. Lub, bardziej ogólnie: zawsze wolą tworzyć nowe (najlepiej niezmienne) wartości zamiast mutować istniejące obiekty - to sprawia, że ​​przepływ sterowania jest łatwiejszy do zrozumienia.