2011-03-01 14 views
6

का उपयोग कर सभी टॉमकैट वेबपैप्स को सुरक्षित रूप से सुरक्षित करें मेरे पास टॉमकैट 6 सर्वर है जिसमें तीन वेबपैप्स हैं: रूट, जेनकींस और नेक्सस के रूप में एक कस्टम।बेसिक प्रमाणीकरण

मैं बेसिक प्रमाणीकरण का उपयोग कर तीनों केंद्रीय (server.xml?) को सुरक्षित करना चाहता हूं।

मैं बिना वेबपैप्स को संशोधित या कॉन्फ़िगर करने के बिना कैसे प्राप्त कर सकता हूं?

उत्तर

7

सबसे पहले मैंने conf/context.xml में BasicAuthenticator वाल्व को शामिल करने के लिए (बिना सफलता के) प्रयास किया। ऐसा कोई प्रभाव नहीं प्रतीत होता है।

अंत में मैं इसे conf/web.xml को यह स्निपेट जोड़कर काम करने के लिए (सभी webapps सुरक्षित) हो गया है:

<security-constraint> 
    <web-resource-collection> 
     <web-resource-name>Basic Authentication</web-resource-name> 
<!--Here wildcard entry defines authentication is needed for whole app --> 
      <url-pattern>/*</url-pattern> 
     <http-method>GET</http-method> 
     <http-method>POST</http-method> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>myrole</role-name> 
    </auth-constraint> 
</security-constraint> 

<login-config> 
    <auth-method>BASIC</auth-method> 
</login-config> 

<security-role> 
    <description>My role</description> 
    <role-name>myrole</role-name> 
</security-role> 
4

दो तरीके दिमाग में आते हैं:

  1. आप conf/context.xml, जो सभी webapps से शामिल हो जाता है संशोधित कर सकते हैं, और वहाँ में प्रमाणीकरण निर्देशों डालें। नुकसान यह है कि आप जहां तक ​​मुझे पता है, प्रमाणीकरण से एक वेबपैप को बाहर नहीं कर सकते हैं, और सभी वेबैप समान भूमिका आवश्यकताओं को साझा करेंगे (हालांकि यह आपको लगता है कि आपको क्या चाहिए)
  2. आप अपाचे या किसी अन्य वेबसर्वर के माध्यम से सुरक्षा को कार्यान्वित कर सकते हैं टॉमकैट के सामने दौड़ रहा है। यह समझ में आता है खासकर अगर आपके पास पहले से ही एक है।
2

यह किया जा सकता है, लेकिन आपको इस पर काम करने की आवश्यकता होगी।

टॉमकैट के लिए, मूल रूप से आप जो चाहते हैं वह Tomcat Valve है। यह एक सर्वलेट फ़िल्टर की तरह है, लेकिन यह टोमकैट विशिष्ट है।

आप अपने सर्वर कॉन्फ़िगरेशन के HOST एंट्री में वाल्व डाल सकते हैं, तो उस होस्ट के सभी ऐप्स को उस वाल्व से गुजरना होगा। और वह वाल्व वह है जो आपको अपने मूलभूत प्रमाणीकरण को संभालने की आवश्यकता है।

टोमकैट के पास पहले से ही मूलभूत प्रमाणीकरण वाल्व है, लेकिन इसे वेब ऐप के साथ काम करने के लिए डिज़ाइन किया गया है। आप शायद इस पर स्रोत को पकड़ सकते हैं और वेब ऐप स्तर की बजाय मेजबान स्तर पर काम करने के लिए उस पर हैक कर सकते हैं, इस प्रकार व्यक्तिगत रूप से उन्हें कॉन्फ़िगर किए बिना अपने सभी ऐप्स की सुरक्षा कर सकते हैं।

अब, यदि आप थोड़ा अधिक खुले दिमाग में थे, तो मैं Tomcat Single Sign On का सुझाव दूंगा, और उसके बाद सर्वलेट spec के बाद अपने वेब.एक्सएमएल में बेसिक का उपयोग करने के लिए प्रत्येक वेब ऐप्स को बढ़ा रहा हूं। यह व्यक्तिगत अनुप्रयोगों web.xml में मूल रूप से मामूली परिवर्तन है, लेकिन यह आपके लिए समस्या हल करता है। लेकिन आपने कहा था कि आप वेब ऐप्स को संशोधित नहीं करना चाहते थे, इसलिए आप टॉमकैट विशिष्ट सामग्री का उपयोग करके फंस गए हैं, और उस पर "हाथ क्राफ्टिंग" स्वयं ही हैं।

+0

हाय विल, मैंने आपका विचार लिया और इसे एक छिपी हुई विशेषता के साथ विभाजित किया और पूरी बात केवल कुछ बयान है। अजीब क्यों यह BasicAuthenticator में अंतर्निहित नहीं है ... – mogsie

1

यह संभव है, लेकिन AFAIK इसके बिना संभव नहीं है (कुछ) कोड। यहां एक समाधान है जो किसी भी तरह से तैनात वेबपैप्स को स्पर्श नहीं करता है, लेकिन यह आपको कोई भी अच्छी तरह से अधिकृत प्राधिकरण, केवल प्रमाणीकरण नहीं देता है।

टॉमकैट 7 (और 6?) प्रमाणीकरण प्रदर्शन करने के लिए एक गंधा सुविधा भले ही वेब अनुप्रयोग में कोई संरक्षित संसाधन हैं, है preemtiveAuthentication कहा जाता है:

<Context preemptiveAuthentication="true"> 
    <Valve className="org.apache.catalina.authenticator.BasicAuthenticator" /> 
</Context> 

पॉप अपने संदर्भ में जहां कहीं भी हो सकता है कि (शायद आप $CATALINA_BASE/conf/Catalina/localhost/mywebapp.xml बनाने के लिए mywebapp की रक्षा के लिए की जरूरत है। युद्ध)।

यह प्रमाणीकरण को ट्रिगर करने के लिए प्राधिकरण शीर्षलेख में किसी भी चीज़ के साथ आने वाला अनुरोध करेगा। के बिना कोई भी अनुरोध प्राधिकरण शीर्षलेख अभी भी प्राप्त होगा।

  • http://example.com:8080/mywebapp/, काम करेंगे, जबकि/
  • http://user:[email protected]:8080/mywebapp/ नहीं (या, यह एक उपयोगकर्ता नाम और पासवर्ड के लिए जाँच करेगा) होगा

शेष चाल यात्रा करने के लिए इसलिए है कि "सुविधा" हर समय, उन उपयोगकर्ताओं के लिए भी जो कोई प्राधिकरण शीर्षलेख नहीं भेजते हैं। यह वह जगह है जहां मुझे वाल्व पर वापस जाना पड़ा।

यहां एक वाल्व का कोड है जो अनुरोधकर्ता शीर्षलेख "प्राधिकरण" को "foo" सेट करता है यदि यह मौजूद नहीं है।

import javax.servlet.ServletException; 
import java.io.IOException; 
import org.apache.catalina.valves.ValveBase; 
import org.apache.catalina.connector.Request; 
import org.apache.catalina.connector.Response; 

public class ConditionallyAddFakeAuthorizationHeader extends ValveBase { 
    public void invoke(Request request, Response response) throws IOException, ServletException { 
    if (request.getCoyoteRequest().getMimeHeaders().getValue("authorization") == null) { 
     request.getCoyoteRequest().getMimeHeaders().addValue("authorization").setString("foo"); 
    } 
    getNext().invoke(request, response); 
    } 
} 

फ़ाइल संकलित करें, अगर आप चाहते हैं कि यह एक अच्छा पैकेज देने के लिए और बिलाव की साझा classpath में डाल दिया है, और अपने mywebapp.xml बदलने के रूप में निम्नानुसार जोड़ने (बुनियादी authenicator से पहले नए वाल्व जोड़ने!):

<Context preemptiveAuthentication="true"> 
    <Valve className="ConditionallyAddFakeAuthorizationHeader"/> 
    <Valve className="org.apache.catalina.authenticator.BasicAuthenticator" /> 
</Context> 

और देखा, अपने संदर्भ किसी भी अनुरोध के माध्यम से, जब तक यह क्षेत्र आपके द्वारा निर्धारित दिशा में प्रमाणीकृत है अनुमति नहीं दी जाएगी।