2016-07-28 19 views
8

मैं जीडब्ल्यूटी के साथ विकसित तीसरे पक्ष के आवेदन के साथ काम करने के लिए विंडोज प्रमाणीकरण प्राप्त करने की कोशिश कर रहा हूं। मैं एक विंडोज सर्वर पर, टोमकैट के साथ ऐप होस्ट कर रहा हूं। मैं आईआईएस प्रॉक्सी के माध्यम से साइट तक पहुंचता हूं (टॉमकैट के दस्तावेज़ीकरण के बाद स्थापित)।अनुरोध क्यों है .getRemoteUser() कभी-कभी टॉमकैट विंडोज सेवा खाते को वापस लौटाता है

यदि मैं "<% = request.getRemoteUser()%>" प्रदर्शित करने के लिए वेबपैप के .jsp को संशोधित करता हूं, तो मुझे अपना विंडोज खाता, मैं अपना उपयोगकर्ता नाम प्राप्त कर रहा हूं।

लेकिन वेबपैप मुझे उस खाते से प्रमाणित करता है जिसे मैंने सर्वर पर टॉमकैट विंडोज सेवा स्थापित की है।

वेबपैप के (डिकंपिल्ड) स्रोत कोड में, मुझे सटीक "request.getRemoteUser()" पर एक कॉल दिखाई देता है, इसलिए मुझे आश्चर्य है कि अंतर कहां हो सकता है।

import javax.servlet.http.HttpServletRequest; 

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

और:: 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; 
    } 
} 

मेरी समस्या गूगल के guice पर इस बग से जोड़ा जा सकता है

यहाँ decompiled कक्षाओं कर रहे हैं?

यदि हां, तो क्या कोई काम है?

+0

मैंने यहां अपना प्रश्न दोहराया: http://stackoverflow.com/questions/38664679/request-getremoteuser-returns-a-different-login-in-jsp-than-in-a-servlet-filt, अतिरिक्त परीक्षण के बाद इस संभावना को रद्द करने के लिए कि समस्या guice/gwt के साथ थी। – Laloutre

उत्तर

0

HttpServletRequest.getRemoteUser() आमतौर पर केवल CGI REMOTE_USER चर के समान मान देता है, जो HTTP Basic प्रमाणीकरण से उपयोगकर्ता नाम है। ऐसा लगता है कि आप इसे एक अलग मान चाहते हैं, जिसका अर्थ है कि HttpServletRequest ऑब्जेक्ट को संशोधित कर रहा है। सबसे अधिक संभावना यह एक सर्वलेट फ़िल्टर द्वारा पूरा किया जाता है।

कि Guice बग दोषी है, तो यह काफी आसान हल करने के लिए है: केवल यह सुनिश्चित GuiceFilter स्थापित किया गया है कि के बाद जो कुछ भी फ़िल्टर अनुरोध के सत्यापन और HttpServletRequest वस्तु को संशोधित किया गया है।

अंगूठे के सामान्य नियम के रूप में, मुझे नहीं लगता कि अनुरोध को संशोधित करना एक अच्छा विचार है, ठीक है क्योंकि कुछ गलत होने पर डीबग करना मुश्किल होता है। यदि इसके बजाय आपके पास @RequestScoped प्रदाता था जो उस अनुरोध को निकाला गया था जिसे आप अनुरोध से बाहर करना चाहते थे और आपने जो भी प्रमाणीकरण की आवश्यकता है, तो आप इसके बजाय निर्भरता इंजेक्शन द्वारा उपयोगकर्ता की जानकारी का उपभोग कर सकते हैं। या, अधिक आम तौर पर: हमेशा मौजूदा वस्तुओं को म्यूट करने के बजाय नए (अधिमानतः अपरिवर्तनीय) मान बनाना पसंद करते हैं - इससे नियंत्रण प्रवाह को कारणों के लिए अधिक आसान बना दिया जाता है।

संबंधित मुद्दे