0

在 XPage 内的 Domino 服务器上使用 Codehaus Jackson 会产生以下堆栈跟踪

[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)

在 java.policy 我尝试了以下设置:

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

第一个权限与当前问题无关。我试图用第二个和第三个设置来解决它,但它不起作用。

只有最后一个设置有帮助,但这已经很重要了......有更好的解决方案吗?

4

1 回答 1

1

我不熟悉 Domino XPages,但我认为它遵循标准的 Java 安全方案,所以这里有一些想法/想法:

不要将您的应用程序特定的安全配置放在“全局”空间中。相反,找到正确的代码库并将其添加到 java.policy 文件中它自己的 codepase 部分:

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

弄清楚你的“codeBase”是什么,然后用它代替“myCodeBase”。

对于不同类型的访问所需的特定权限,您可以查看文档Permissions in Java™ SE 7 Development Kit (JDK)。在您的堆栈跟踪中,似乎getDeclaredMethods是导致问题的调用。在提到的文档中,描述了所需的权限:

java.lang.类

公共类[] getDeclaredClasses() 公共字段[] getDeclaredFields()

公共方法[] getDeclaredMethods()

公共构造函数[] getDeclaredConstructors()

公共字段 getDeclaredField(字符串名称)

公共方法 getDeclaredMethod(...)

公共构造函数 getDeclaredConstructor(...)

需要权限

如果“this”类的类加载器与调用者的类加载器相同,则默认 checkMemberAccess 不需要任何权限。否则,它需要 java.lang.RuntimePermission "accessDeclaredMembers"。如果此类在包中,则还需要 java.lang.RuntimePermission "accessClassInPackage.{pkgName}"。

因此,您在策略文件中的注释条目似乎是正确的。如果您取消注释这些行,它应该可以解决这个特定的安全异常,但您可能会遇到新的异常。

编辑:您说不能为您的应用程序指定代码库,但您至少应该能够指定指向您的特定 jar 文件的代码库,如下所示:

grant codeBase "file://file_url_to_jar" { }

它可能无法解决您的问题,但可以让您更进一步。

编辑:

如果一切都失败了,仍然无法正常工作,您可以打开 java 安全调试。它会产生大量输出,但有助于追踪安全错误。通过添加-Djava.security.debug=all到 JVM 启动选项来启用它。

编辑:

accessDeclaredMembers对于这个特定的权限accessDeclaredMembers( .

于 2013-04-02T10:04:02.130 回答