यह संभव है, लेकिन 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>
और देखा, अपने संदर्भ किसी भी अनुरोध के माध्यम से, जब तक यह क्षेत्र आपके द्वारा निर्धारित दिशा में प्रमाणीकृत है अनुमति नहीं दी जाएगी।
हाय विल, मैंने आपका विचार लिया और इसे एक छिपी हुई विशेषता के साथ विभाजित किया और पूरी बात केवल कुछ बयान है। अजीब क्यों यह BasicAuthenticator में अंतर्निहित नहीं है ... – mogsie