Autorisation Java pour Jackson sur Domino XPage


L'utilisation de Codehaus Jackson sur un serveur Domino dans un XPages produit la trace de pile suivante

[07715:00011-2293234576] 04/02/2013 10:28:12 AM  HTTP JVM: java.lang.SecurityException: not allowed to access members in class class java.util.ArrayList
[07715:00011-2293234576] 04/02/2013 10:28:12 AM  HTTP JVM:  at java.lang.Throwable.<init>(Throwable.java:67)
[07715:00011-2293234576] 04/02/2013 10:28:12 AM  HTTP JVM:  at lotus.notes.AgentSecurityManager.checkMemberAccess(Unknown Source)
[07715:00011-2293234576] 04/02/2013 10:28:12 AM  HTTP JVM:  at java.lang.Class.checkMemberAccess(Class.java:112)
[07715:00011-2293234576] 04/02/2013 10:28:12 AM  HTTP JVM:  at java.lang.Class.getDeclaredMethods(Class.java:675)
[07715:00011-2293234576] 04/02/2013 10:28:12 AM  HTTP JVM:  at org.codehaus.jackson.map.introspect.AnnotatedClass._addMemberMethods(AnnotatedClass.java:620)
[07715:00011-2293234576] 04/02/2013 10:28:12 AM  HTTP JVM:  at org.codehaus.jackson.map.introspect.AnnotatedClass.resolveMemberMethods(AnnotatedClass.java:413)
[07715:00011-2293234576] 04/02/2013 10:28:12 AM  HTTP JVM:  at org.codehaus.jackson.map.introspect.BasicClassIntrospector.classWithCreators(BasicClassIntrospector.java:185)
[07715:00011-2293234576] 04/02/2013 10:28:12 AM  HTTP JVM:  at org.codehaus.jackson.map.introspect.BasicClassIntrospector.collectProperties(BasicClassIntrospector.java:157)
[07715:00011-2293234576] 04/02/2013 10:28:12 AM  HTTP JVM:  at org.codehaus.jackson.map.introspect.BasicClassIntrospector.forSerialization(BasicClassIntrospector.java:96)
[07715:00011-2293234576] 04/02/2013 10:28:12 AM  HTTP JVM:  at org.codehaus.jackson.map.introspect.BasicClassIntrospector.forSerialization(BasicClassIntrospector.java:16)
[07715:00011-2293234576] 04/02/2013 10:28:12 AM  HTTP JVM:  at org.codehaus.jackson.map.SerializationConfig.introspect(SerializationConfig.java:973)

Dans le java.stratégie J'ai essayé ces paramètres:

// Jackson (JSON)
permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
// permission java.lang.RuntimePermission "accessDeclaredMembers";
// permission java.lang.RuntimePermission "accessClassInPackage.java.util.ArrayList";
permission java.security.AllPermission;

La première autorisation n'a rien à voir avec le problème actuel. J'ai essayé de le résoudre avec les deuxième et troisième paramètres, mais cela ne fonctionne pas.

Seul le dernier paramètre aide, mais c'est beaucoup... De meilleures solutions?

Author: Nabor, 2013-04-02

1 answers

Je ne suis pas familier avec Domino XPages, mais je suppose qu'il suit le schéma de sécurité Java standard, alors voici quelques réflexions/idées:

Ne placez pas votre configuration de sécurité spécifique à l'application dans l'espace "global". Au lieu de cela, trouvez la base de code correcte et ajoutez-la à sa propre section de base de code dans java.fichier de stratégie:

grant codeBase "myCodeBase" {
    // Security configuration here, e.g.
    // permission java.security.AllPermission;
    // If you end up using AllPermissions, at least it only applies to your app
};

Déterminez quelle est votre "base de code" et insérez-la à la place de "myCodeBase".

Pour les autorisations spécifiques nécessaires pour différents types d'accès, vous pouvez vérifier les autorisations du document dans le Kit de développement Java™ SE 7 (JDK). Dans votre stacktrace, il semble que c'est l'appel getDeclaredMethods qui est la cause du problème. Dans le document mentionné, les autorisations requises sont décrites:

Java.lang.Classe

Classe publique [] getDeclaredClasses() champ public [] getDeclaredFields ()

Méthode publique [] getDeclaredMethods ()

Constructeur public[] getDeclaredConstructors ()

Champ public getDeclaredField (Nom de chaîne)

Méthode publique getDeclaredMethod(...)

Constructeur public getDeclaredConstructor (...)

Nécessite des autorisations

CheckMemberAccess par défaut ne nécessite aucune autorisation si le classloader de "cette" classe est le même que celui de l'appelant. Sinon, il nécessite java.lang.RuntimePermission "accessDeclaredMembers". Si cette classe est dans un package java.lang.RuntimePermission " accessClassInPackage.{pkgName} " est également requis.

Vos entrées commentées dans les fichiers de stratégie semblent donc correctes. Si vous décommentez ces lignes, cela devrait résoudre cette exception de sécurité particulière, mais vous pourriez en rencontrer de nouvelles.

Edit: Vous dites que cou ne peut pas spécifier de base de code pour votre application, mais vous devriez au moins pouvoir spécifier une base de code pointant vers votre fichier jar spécifique, comme ceci:

grant codeBase "file://file_url_to_jar" { }

Il pourrait pas résoudre votre problème, mais pourrait vous faire un pas de plus.

Modifier:

Si tout le reste échoue et que cela ne fonctionne toujours pas, vous pouvez activer le débogage de sécurité java. Cela produira beaucoup de sortie, mais il peut être utile de traquer les erreurs de sécurité. Activez-le en ajoutant -Djava.security.debug=all aux options de démarrage de la JVM.

Modifier:

Pour cette autorisation particulière (accessDeclaredMembers), le problème pourrait éventuellement être résolu en ajoutant le pot jackson au dossier lib / ext du JVM, car cela rendrait les classes chargées avec le même chargeur de classe que les classes JRE, et la vérification accessDeclaredMembers est ignorée.

 1
Author: NilsH, 2013-04-02 11:16:30