2016-07-28 13 views
8

GWT ile geliştirilmiş bir 3. parti uygulamasıyla çalışmak için Windows kimlik doğrulaması almaya çalışıyorum. Uygulamaya, bir windows sunucusunda tomcat ile ev sahipliği yapıyorum. Siteye bir IIS proxy'si üzerinden erişiyorum (tomcat'in belgelerini izleyerek yüklendi).Neden request.getRemoteUser() tomcat windows hizmet hesabını döndürüyor bazen

"<% = request.getRemoteUser()%>" öğesini görüntülemek için webapp'ın bir .jsp'sini değiştirirseniz, windows hesabım için atladığım kullanıcı adını alıyorum.

Ancak webapp, Tomcat windows hizmetini sunucuda yüklediğim hesapla beni doğrular.

Webapp'ın (kaynak kodlu) kaynak kodunda, tam olarak aynı "request.getRemoteUser()" çağrısı görüyorum, bu yüzden farkın nerede olabileceğini merak ediyorum.

import javax.servlet.http.HttpServletRequest; 

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

Ve: https://github.com/google/guice/issues/780:

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

benim sorunum google'ın Guice bu hatadan bağlanabilir Could İşte

bozulamaz sınıfları nelerdir?

Öyleyse, etrafta bir iş var mı?

+0

Sorumu burada tekrar yazdım: http://stackoverflow.com/questions/38664679/request-getremoteuser-returns-a-different-login-in-jsp-than-in-a-servlet-filt, ek testlerden sonra Sorunun guice/gwt ile olasılığını dışlamak için. – Laloutre

cevap

0

HttpServletRequest.getRemoteUser() normalde, HTTP Temel Kimlik Doğrulaması'nın kullanıcı adı olan CGI REMOTE_USER değişkeni ile aynı değeri döndürür. Farklı bir değer olmasını istediğiniz gibi geliyor, yani bir şey HttpServletRequest nesnesini değiştiriyor. Büyük olasılıkla bu bir Servlet Filtresi ile gerçekleştirilir.

o Guice hata suçlu ise, geçici bir çözüm için yeterli kolay: sadece GuiceFilter ne olursa olsun Filtre talebinin doğrulanmasını ve HttpServletRequest nesneyi değiştiriyorsa sonra yüklü olduğundan emin olun.

Genel bir kural olarak, sanırım bir şey yanlış gittiğinde hata ayıklaması çok zor olduğundan, isteğin bu şekilde değiştirilmesinin iyi bir fikir olduğunu düşünmüyorum. Bunun yerine, isteğiniz dışında istediğiniz değeri (değerleri) çıkartan ve ihtiyacınız olan herhangi bir kimlik doğrulama işlemini yapan bir @RequestScoped sağlayıcınız varsa, bunun yerine kullanıcı bilgilerini bağımlılık enjeksiyonuna göre tüketebilirsiniz. Ya da, daha genel olarak: her zaman mevcut nesneleri mutasyona uğratmak yerine yeni (tercihen değişmez) değerler yaratmayı tercih eder - kontrol akışını akılda tutmak daha kolay hale getirir.

İlgili konular