2009-04-17 22 views
16

क्या जावा सुरक्षा प्रबंधक को पूरी तरह अक्षम करने का कोई तरीका है?
जावा सुरक्षा प्रबंधक को कैसे अक्षम करें?

मैं डीबी 4o के स्रोत कोड के साथ प्रयोग कर रहा हूं। यह वस्तुओं को जारी रखने के लिए प्रतिबिंब का उपयोग करता है और ऐसा लगता है कि सुरक्षा प्रबंधक निजी या संरक्षित क्षेत्रों को पढ़ने और लिखने के प्रतिबिंब की अनुमति नहीं देता है।

मेरे कोड:

public static void main(String[] args) throws IOException { 
    System.out.println("start"); 
    new File(DB_FILE_NAME).delete(); 
    ObjectContainer container = Db4o.openFile(DB_FILE_NAME); 
    String ob = new String("test"); 
    container.store(ob); 
    ObjectSet result = container.queryByExample(String.class); 
    System.out.println("retrieved (" + result.size() + "):"); 
    while(result.hasNext()) { 
     System.out.println(result.next()); 
    } 
    container.close(); 
    System.out.println("finish"); 
} 

आउटपुट:

 
start 
[db4o 7.4.68.12069 2009-04-18 00:21:30] 
AccessibleObject#setAccessible() is not available. Private fields can not be stored. 
retrieved (0): 
finish 


This thread पता चलता है java.policy फ़ाइल को संशोधित करने के प्रतिबिंब अनुमति देने के लिए, लेकिन यह मेरे लिए काम करने के लिए प्रतीत नहीं होता।

 
grant { 
    permission java.security.AllPermission; 
    permission java.lang.reflect.ReflectPermission "suppressAccessChecks"; 
}; 

मैं पिछले 3 घंटे बिताए: तर्क के साथ

मैं शुरू कर JVM
-Djava.security.manager -Djava.security.policy==/home/pablo/.java.policy
तो निर्दिष्ट नीति फ़ाइल केवल नीति फ़ाइल का उपयोग किया

फ़ाइल इस तरह दिखता हो जाएगा यह और इस विचार को बनाने के लिए कोई विचार नहीं है। किसी भी मदद की सराहना की।

+0

क्या आपने सेट अप करने योग्य या अन्य विशेषाधिकार प्राप्त कार्यों को अपने कोड से कॉल करने का प्रयास किया है? –

+0

पूर्ण कमांड लाइन भी उपयोगी हो सकती है। –

+1

क्या आपके वीएम तर्क सही हैं? आपके पास लगता है -Djava.security.policy ==? –

उत्तर

5

क्या आपके पास वास्तव में आपके java.security.policy कमांड लाइन विकल्प में दो '=' संकेत हैं? वह काम नहीं करेगा। सुनिश्चित करें कि आप

-Djava.security.policy=/home/pablo/.java.policy 

के रूप में संपत्ति सेट कर रहे हैं वास्तव में SecurityManager को अक्षम करने के लिए, बस java.security.manager प्रणाली संपत्ति है छोड़ना पूरी तरह पर्याप्त होना चाहिए बनाओ।


अद्यतन: जैसा कि मैंने प्रलेखन नीति फ़ाइलों के बारे में "==" वाक्य रचना, मैंने देखा है और अधिक है कि जब तक नीति फ़ाइल वर्तमान कार्यशील निर्देशिका में है, यह निर्दिष्ट करने की जरूरत है जानने के लिए पढ़ रहा था एक यूआरएल (योजना सहित) के रूप में। क्या आपने "फ़ाइल:" योजना के साथ नीति पथ को उपसर्ग करने का प्रयास किया है?

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

+4

यह काम नहीं करता है। न तो JVM को किसी भी तर्क को पारित नहीं करता है। बीटीडब्ल्यू '==' का अर्थ है कि निर्दिष्ट फ़ाइल एकमात्र फ़ाइल होगी। एकल '=' का अर्थ है कि फ़ाइल का उपयोग मानक नीति फ़ाइलों के साथ किया जाएगा। कम से कम यही मैंने पढ़ा है। –

6

आप मुख्य() अपने कार्यक्रम के लिए इस जोड़ने की कोशिश कर सकते हैं:

System.setSecurityManager(null); 

एक "विश्वसनीय" WebStart आवेदन जब मैं सुरक्षा प्रबंधक मुद्दों कर रहा था के लिए मेरे लिए काम किया। सुनिश्चित नहीं है कि यह आपके डीबी 4o मामले के लिए काम करेगा, लेकिन यह एक कोशिश के लायक हो सकता है।

संपादित करें: मैं यह सुझाव नहीं दे रहा हूं कि यह सुरक्षा प्रबंधक समस्याओं का एक सामान्य समाधान है। मैं मूल पोस्टर की समस्या को डीबग करने में मदद करने के लिए इसे एक तरीका के रूप में पेश कर रहा था। जाहिर है, अगर आप किसी सुरक्षा प्रबंधक से लाभ उठाना चाहते हैं तो आपको इसे अक्षम नहीं करना चाहिए।

+1

आमतौर पर इसकी सलाह नहीं दी जाती है क्योंकि इसे सुरक्षा को कम करने और स्थानीय उपयोगकर्ता विशेषाधिकार प्राप्त करने के लिए दुर्भावनापूर्ण कोड द्वारा उपयोग किया जा सकता है। –

+8

मूल पोस्टर * सुरक्षा प्रबंधक को 'पूरी तरह से अक्षम' करने की तलाश में है! :-) –

+0

काम नहीं करता है:/धन्यवाद वैसे भी –

4

मुझे यह उदाहरण मिला है कि आपके कोड में make private fields and methods accessible कैसे करें। असल में, यह फ़ील्ड के उपयोग तक सीमित हो जाता है।setAccessible (सही) और Method.setAccessible (सच)

फील्ड उदाहरण:

Field privateStringField = PrivateObject.class. 
      getDeclaredField("privateString"); 

privateStringField.setAccessible(true); 

विधि उदाहरण:

Method privateStringMethod = PrivateObject.class. 
     getDeclaredMethod("getPrivateString", null); 

privateStringMethod.setAccessible(true); 

तुम भी रूप में अपने जावा कोड के साथ ग्रूवी का उपयोग कर देख सकता यह (वर्तमान में) जावा कोड के एक्सेस स्तर प्रतिबंधों में से अधिकांश को रोकता है। हालांकि, यह संदेश बोर्ड पोस्टिंग इस 'फीचर' may change in future versions of Groovy का सुझाव देती है।

+7

सुरक्षा प्रबंधक को अक्षम करके आपको सेट एक्सेस करने योग्य (सत्य) कॉल करने की अनुमति मिलती है। सुरक्षा प्रबंधक को अक्षम किए बिना आपको प्रार्थना नहीं होगी। – extraneon

+0

@ केविन: मैं अपने स्वयं के कोड में निजी फ़ील्ड के लिए सेट एक्सेसिबल को कॉल कर सकता हूं। और 'मेरे अपने कोड' से मेरा मतलब है कि मैंने कक्षा को डीबी 4o स्रोतों में जोड़ा है। –

+0

आपको इसे अपने कोड पर तब तक कॉल करने में सक्षम होना चाहिए जब तक कि आप इसे एक एपलेट या किसी अन्य वातावरण में नहीं चला रहे हैं, जैसे कि एक उल्लंघनकारी सुरक्षा प्रबंधक के साथ (+1) @extraneon सुझाता है। इस आर्टिमा पोस्ट में जावा सुरक्षा प्रबंधक का एक अच्छा स्पष्टीकरण है: http://www.artima.com/underthehood/securitymanager.html –

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