Comment désactiver Java security manager?


Existe-t-il un moyen de désactiver complètement Java security manager?

J'expérimente avec le code source de db4o. Il utilise la réflexion pour persister les objets et il semble que security manager ne permette pas à la réflexion de lire et d'écrire des champs privés ou protégés.

Mon code:

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");
}

Sortie:

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


Ce thread suggère la modification de java.fichier de stratégie pour permettre la réflexion mais cela ne semble pas fonctionner pour moi.

Je démarre JVM avec arguments
-Djava.security.manager -Djava.security.policy==/home/pablo/.java.policy
le fichier de stratégie ainsi spécifié sera le seul fichier de stratégie utilisé

Le fichier ressemble à ceci:

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

J'ai passé les 3 dernières heures à ce sujet et je n'ai aucune idée de comment faire fonctionner cela. Toute aide appréciée.

Author: Pawel Piatkowski, 2009-04-18

3 answers

Vous pouvez essayer d'ajouter ceci à la main () de votre programme:

System.setSecurityManager(null);

A travaillé pour moi pour une application WebStart "de confiance" lorsque j'avais des problèmes de gestionnaire de sécurité. Je ne sais pas si cela fonctionnera pour votre cas db4o, mais cela pourrait valoir la peine d'essayer.

EDIT: Je ne suggère pas qu'il s'agisse d'une solution générale aux problèmes du gestionnaire de sécurité. Je le proposais juste comme un moyen d'aider à déboguer le problème de l'affiche originale. De toute évidence, si vous souhaitez bénéficier d'un gestionnaire de sécurité, vous ne devrait pas le désactiver.

 6
Author: hallidave, 2009-04-18 16:17:22

Avez-vous vraiment deux signes ' = ' dans votre option de ligne de commande java.security.policy? Cela ne marchera pas. Assurez-vous que vous définissez la propriété

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

Pour désactiver réellement le SecurityManager, il suffit de laisser complètement la propriété système java.security.manager.


Update: En lisant la documentation des fichiers de stratégie pour en savoir plus sur la syntaxe"==", j'ai remarqué que, sauf si le fichier de stratégie se trouve dans le répertoire de travail actuel, il doit être spécifié sous forme d'URL (y compris le régime). Avez-vous essayé de préfixer le chemin de la stratégie avec le schéma "file:"?

J'étais également perplexe parce que (en supposant que vous exécutez en tant qu'utilisateur "pablo"), il semble que cette stratégie devrait être chargée par défaut à partir de votre répertoire personnel, vous ne devriez donc pas avoir besoin de la spécifier du tout. D'autre part, si vous n'exécutez pas en tant qu'utilisateur "pablo", peut-être que le fichier n'est pas lisible.

 5
Author: erickson, 2009-04-21 05:15:08

J'ai trouvé cet exemple de comment rendre les champs privés et les méthodes accessibles à votre code. Fondamentalement, il se résume à l'utilisation du champ .setAccessible(true) et Méthode.setAccessible (true)

Exemple de Champ:

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

privateStringField.setAccessible(true);

Exemple de Méthode:

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

privateStringMethod.setAccessible(true);

Vous pouvez également envisager d'utiliser Groovy avec votre code Java car il contourne (actuellement) une grande partie des restrictions de niveau d'accès du code Java. Bien que, cette publication sur le babillard semble suggérer cela 'fonction' peut changer dans les futures versions de Groovy.

 4
Author: Kevin Williams, 2009-04-18 05:55:01