2013-04-02 2 views
0

En utilisant Codehaus Jackson sur un serveur Domino dans un XPages produit la trace de la pile suivanteJava L'autorisation de Jackson sur Domino XPage

[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.policy 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; 

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

Seul le dernier réglage aide, mais c'est beaucoup plus ... De meilleures solutions?

+0

Toutes les classes/jars dans la pile d'appels doivent avoir les permissions correctes, et pas seulement le dernier appelant. Vous ne montrez pas la section de stratégie complète et la trace de la pile, il est donc difficile de dire si c'est le problème. Il serait utile que vous puissiez ajouter d'autres informations. – NilsH

+0

http://pastebin.com/iP3YNchM – Nabor

+0

http://pastebin.com/XbHSRnTy – Nabor

Répondre

1

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 pensées/idées:

Ne mettez pas votre application de configuration de sécurité spécifique dans l'espace « global » . Au lieu de cela, trouver le bon code de base et l'ajouter à sa propre section codepase dans le fichier java.policy:

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

Calculez ce que votre « codeBase » est et l'insérer à la place de « myCodeBase ».

Pour les autorisations spécifiques requises pour différents types d'accès, vous pouvez consulter le document Permissions in Java™ SE 7 Development Kit (JDK). Dans votre pile, 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.Class

Classe publique [] getDeclaredClasses() publique sur le terrain []() getDeclaredFields

Méthode publique [ ] getDeclaredMethods()

constructeur public []() getDeclaredConstructors

Publique getDeclaredField (String name)

publiques Méthode getDeclaredMethod (...)

Constructor publique getDeclaredConstructor (...)

a besoin d'autorisations

Par défaut checkMemberAccess 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, il devrait résoudre cette exception de sécurité particulière, mais vous pourriez en rencontrer de nouvelles.

Edit: Vous dites COU ne peut pas spécifier une base de code pour votre application, mais vous devez au moins être en mesure de spécifier un pointage codebase à votre fichier jar spécifique, comme ceci:

grant codeBase "file://file_url_to_jar" { } 

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

Edit:

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

Edit:

Pour cette autorisation particulière (accessDeclaredMembers), le problème pourrait être résolu en ajoutant le pot jackson dans le dossier lib/ext de la machine virtuelle Java, car cela rendrait les classes sont chargées avec le même classloader que les classes JRE et la vérification accessDeclaredMembers est ignorée.

+0

Non, les lignes commentées ne résolvent pas cette exception de sécurité particulière, c'est pourquoi j'ai posé la question ici. J'ai lu la documentation Java Permission. Là j'ai trouvé les permissions, que j'ai essayées, mais comme je l'ai écrit, elles ne fonctionnent pas ... Concernant le bloc grant, je développe Java sur Domino depuis plus de 10 ans, autant que je sache, il n'y a pas d'autre moyen utiliser le bloc global de subvention. – Nabor

+0

Oui, je sais que vous avez mentionné que vous aviez essayé ces lignes. Mais obtenez-vous exactement la même exception? Ou obtenez-vous un stacktrace différent? En outre, j'ai trouvé cette ressource, qui indique qu'il devrait être possible de bloquer spécifique: http://www.wissel.net/blog/d6plinks/SHWL-8JYAT5 J'ai récemment configuré la sécurité pour une application, et je sais par expérience à quel point il est difficile d'obtenir toutes les permissions correctes. Vous en fixez un, puis le suivant vous frappe. Il est donc facile d'ignorer deux exceptions de sécurité différentes qui semblent presque identiques. – NilsH

+0

Non, faites la même exception. – Nabor

Questions connexes