2009-04-21 14 views
18

के लिए जावा प्रतिबिंब अक्षम करें मुझे कुछ अर्ध-भरोसेमंद जावा कोड कॉल करने की आवश्यकता है और उस कोड के निष्पादन की अवधि के लिए प्रतिबिंब का उपयोग करने की क्षमता को अक्षम करना चाहते हैं।वर्तमान धागे

try{ 
    // disable reflection somehow 
    someObject.method(); 
} 
finally{ 
    // enable reflection again 
} 

क्या यह सुरक्षा प्रबंधक के साथ किया जा सकता है, और यदि ऐसा है, तो कैसे?

स्पष्टीकरण/प्रसंग: यह एक पैकेज है कि जावास्क्रिप्ट/राइनो से कहा जा सकता है प्रतिबंधित करने के बारे another question के अनुसरण की है। स्वीकार्य उत्तर उस ब्लॉग एंट्री को संदर्भित करता है कि इसे कैसे किया जाए, और इसके लिए दो कदमों की आवश्यकता होती है, पहला राइनो एपीआई (क्लासशटर) का उपयोग करने वाला पहला, प्रतिबिंब और क्लास .forName() को बंद करने वाला दूसरा। मैं सोच रहा था कि मैं सुरक्षा प्रबंधक का उपयोग करके उस दूसरे चरण को अधिक स्पष्ट रूप से कर सकता हूं (सुरक्षा प्रबंधक के बारे में सीखना, जैसा कि बताया गया है, वैसे ही एक जटिल जानवर है)।

समेकित करने के लिए, मैं कक्षा (forName() को बंद करने और पूरे प्रतिबिंब पैकेज तक किसी भी पहुंच को बंद करने के लिए (कोड से, फ़ाइल सेट नहीं कर रहा) चाहता हूं।

+0

im यकीन नहीं कैसे SecurityManager काम करता है के बारे में है, लेकिन इस सवाल की जाँच: [http : //stackoverflow.com/questions/762459/how-to-disable-java-security-manager] (http://stackoverflow.com/questions/762459/how-to-disable-java-security-manager) –

उत्तर

17

यह इस बात पर निर्भर करता है कि आप क्या प्रतिबंधित करने की कोशिश कर रहे हैं।

सामान्य रूप से, सार्वजनिक रूप से सुलभ एपीआई प्रतिबंधित नहीं है। हालांकि, जब तक आप अविश्वसनीय कोड ReflectPermission("suppressAccessChecks") अनुमति नहीं देते हैं, तब तक यह किसी अन्य पैकेज में गैर-सार्वजनिक API तक पहुंच प्राप्त नहीं कर पाएगा।

यदि आपके पास पैकेज की एक सूची है जिसमें आप सभी पहुंच प्रतिबंधित करना चाहते हैं, तो दो चरण हैं। सबसे पहले, Security गुणों में, include the restricted package in the package.access list। फिर अपने विश्वसनीय कोड RuntimePermission("accessClassInPackage." + pkg) दें।

अपने अविश्वसनीय कोड को अलग करने का एक आम तरीका इसे किसी भिन्न स्थान से लोड करना है, और अनुमतियां देते समय अपनी नीति फ़ाइल में अलग-अलग कोडबेस देखें।

जावा सुरक्षा वास्तुकला बहुत शक्तिशाली है, लेकिन मुझे पता है कि यह भी जटिल है; यदि आप एक और ठोस उदाहरण चाहते हैं, तो कृपया वर्णन करें कि आप कौन से कॉल प्रतिबंधित करना चाहते हैं और मैं और अधिक स्पष्ट होने का प्रयास करूंगा।


java.policy फ़ाइल को संशोधित किए बिना आप क्या चाहते हैं और/या java.security फ़ाइल बहुत मुश्किल है, शायद असंभव हो जाएगा करने के लिए। java.security.Policyjava.policy में जानकारी का प्रतिनिधित्व करता है, लेकिन यह लेखन पहुंच प्रदान नहीं करता है। आप अपना खुद का Policy कार्यान्वयन बना सकते हैं और इसे रनटाइम पर इंस्टॉल कर सकते हैं जब तक कि मौजूदा SecurityManager इसे अनुमति देता है।

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

+0

I प्रश्न में कुछ संदर्भ जोड़ा। – Thilo

4

ठीक है, आप SecurityManager.checkMemberAccess ओवरराइड कर सकते हैं और एक कठोर परिभाषा दे सकते हैं। हालांकि, यह वास्तव में ऐसा काम नहीं करता है। उदाहरण के लिए क्या होता है यदि कोड फाइनलजर को परिभाषित करता है?

स्पष्टीकरण पर: अन्य एपीआई प्रतिबिंब और अन्य एपीआई का उपयोग करते हैं। उदाहरण के लिए, जावा.बीन्स, लाइवकनेक्ट और राइनो। एक विरोधी एक स्क्रिप्ट के भीतर से कह सकता है, शटर के बिना एक नया राइनो संदर्भ बनाएं और इस प्रकार पूर्ण जेआरई में बूटस्ट्रैप करें। एक खुली प्रणाली के साथ, एक ब्लैकलिस्ट कभी खत्म नहीं हो सकती है।

संक्षेप में: जावा सुरक्षा मॉडल का उपयोग करने के लिए आपको इसके साथ काम करने की आवश्यकता है, इसके खिलाफ नहीं।

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