2015-05-06 11 views
7

के पीछे स्प्रिंग सिक्योरिटी के साथ https की आवश्यकता है मेरे पास वसंत सुरक्षा के साथ एक स्प्रिंग एमवीसी एप्लिकेशन सुरक्षित है। अधिकांश एप्लिकेशन संसाधनों को सहेजने के लिए सरल http का उपयोग करते हैं, लेकिन एक छोटा सा हिस्सा अधिक गोपनीय जानकारी को संसाधित करता है और एक https चैनल की आवश्यकता होती है।एक रिवर्स प्रॉक्सी

security-config.xml से

निकालें:

<sec:http authentication-manager-ref="authenticationManager" ... > 
    ... 
    <sec:intercept-url pattern="/sec/**" requires-channel="https"/> 
    <sec:intercept-url pattern="/**" requires-channel="http"/> 
</sec:http> 

सभी ठीक काम किया जब तक हम यह मुख्य सर्वर, जहां आवेदन सर्वर के पीछे चलाने प्रॉक्सी उल्टा करने के लिए स्थानांतरित करने के लिए फैसला किया। और अब एचटीटीपीएस को रिवर्स प्रॉक्सी द्वारा संसाधित किया जाता है, एप्लिकेशन सर्वर केवल HTTP अनुरोध देखता है, और /sec/** पदानुक्रम तक पहुंच को अस्वीकार करता है।

कुछ शोध करने के बाद, मैंने पाया है कि प्रॉक्सी एक X-Forwarded-Proto: https हैडर (*) जोड़ने के लिए, लेकिन वसंत में सुरक्षा HttpServletRequest.isSecure() चैनल सुरक्षा (SecureChannelProcessor जावाडोक से उद्धरण) की पेशकश की

कैसे कर सकता है निर्धारित करने के लिए प्रयोग किया जाता है मैं स्प्रिंग सिक्योरिटी को बताता हूं कि एक सुरक्षित अनुरोध के लिए X-Forwarded-Proto: https हैडर पर्याप्त है?

मुझे पता है कि मैं प्रॉक्सी कॉन्फ़िगरेशन पर उस हिस्से की रिपोर्ट कर सकता हूं, लेकिन प्रॉक्सी व्यवस्थापक वास्तव में उस समाधान को पसंद नहीं करते हैं, क्योंकि प्रॉक्सी के पीछे कई एप्लिकेशन हैं और कॉन्फ़िगरेशन एक गैर-प्रबंधनीय स्थिति में बढ़ सकता है।

मैं वर्तमान में एक्सएमएल कॉन्फ़िगरेशन के साथ स्प्रिंग सुरक्षा 3.2 का उपयोग कर रहा हूं, लेकिन मैं जावा कॉन्फ़िगरेशन और/या अधिक हालिया संस्करण के आधार पर उत्तर स्वीकार करने के लिए तैयार हूं।

(*) बेशक, आने वाले अनुरोध में उपस्थित होने पर प्रॉक्सी हेडर को हटा दें, इसलिए एप्लिकेशन इसमें विश्वास कर सकता है।

+0

आपका ऐप सर्वर क्या है? इसके लिए टॉमकैट कनेक्टर में कोई सेटिंग नहीं है? –

+0

@NeilMcGuigan: हाँ यह एक टोमकैट है। क्या यह इतना आसान हो सकता है? –

+0

@NeilMcGuigan: कृपया इसे एक उत्तर के रूप में लिखें, ताकि मैं इसे स्वीकार कर सकूं। –

उत्तर

4

यदि आपकी साइट HTTPS है और आप टीएलएस समाप्ति को संभालने वाली किसी अन्य प्रणाली के पीछे अपाचे टॉमकैट चला रहे हैं, तो आप टॉमकैट को "नाटक" करने के लिए कह सकते हैं कि यह टीएलएस समाप्ति को संभालने में है।

यह request.isSecure() वापसी true बनाता है;

ऐसा करने के लिए, आपको server.xml में अपने कनेक्टर कॉन्फ़िगरेशन में secure="true" जोड़ने की आवश्यकता है।

https://tomcat.apache.org/tomcat-7.0-doc/config/http.html

भी देखें scheme विशेषता।

+1

यह बिल्कुल अपेक्षित उत्तर नहीं है लेकिन यह मुझे सही रास्ते पर ले गया: इसे स्वीकार करने में खुशी हुई। –

13

नीलएमसीगुइगन के उत्तर में एक फॉलोअप की तरह, जो दिखाता है कि समाधान सर्वलेट कंटेनर पक्ष था।

टोमकैट भी बेहतर है। वाल्वमास्किंग को रिवर्स प्रॉक्सी के साइड इफेक्ट्स के लिए समर्पित है। Remote IP Valve के लिए बिलाव प्रलेखन से निकालें:

इस वाल्व की एक अन्य विशेषता स्पष्ट योजना (HTTP/HTTPS) एक अनुरोध हेडर के माध्यम से एक प्रॉक्सी या एक लोड संतुलन द्वारा प्रस्तुत योजना के साथ, सर्वर पोर्ट और request.secure को बदलने के लिए है (उदाहरण के लिए "एक्स-फॉरवर्ड-प्रोटो")।वाल्व विन्यास की

उदाहरण:

<Valve className="org.apache.catalina.valves.RemoteIpValve" 
    internalProxies="192\.168\.0\.10|192\.168\.0\.11" 
    remoteIpHeader="x-forwarded-for" proxiesHeader="x-forwarded-by" 
    protocolHeader="x-forwarded-proto" /> 

इस तरह आवेदन ही का कोई अन्य विन्यास के साथ, Request.isSecure() करने के लिए कॉल सच वापस आ जाएगी अगर अनुरोध X-Forwarded-Proto=https के एक शीर्ष लेख क्षेत्र में शामिल है।

मैं दो अन्य संभावनाओं के बारे में सोचा था, लेकिन निश्चित prefere है कि एक:

  • एक फिल्टर सक्रिय स्प्रिंग सुरक्षा ChannelProcessingFilter से पहले एक X-Forwarded-Proto हैडर प्रक्रिया पूरी होने में HttpServletRequestWrapperisSecure() अधिभावी साथ अनुरोध रैप करने के लिए उपयोग करें - जरूरत लेखन और फिल्टर और आवरण परीक्षण
  • उपयोग एक स्प्रिंग BeanPostProcessor एक ChannelProcessingFilter देखने के लिए और मैन्युअल X-Forwarded-Proto हैडर विचार करने के लिए एक ChannelDecisionManager सक्षम इंजेक्षन - वास्तव में बहुत कम स्तर
+1

मुझे लगता है कि यह चयनित उत्तर होना चाहिए। निश्चित रूप से मेरी राय में सबसे अच्छा समाधान। धन्यवाद!! – Giordano

+2

@Giordano: जैसा कि मैं सवाल पूछता हूं, वह उत्तर जो मुझे ढूंढने में मदद करता है वह नील का था। यही कारण है कि मैंने इसे स्वीकार किया :-) - लेकिन जैसा कि मैं चाहता था उतना पूरा नहीं था, मैंने इसे जोड़ा। –

+0

सही समझ में आता है, आपको अतिरिक्त जानकारी के इस टुकड़े को साझा करने के लिए धन्यवाद ^^ – Giordano

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