在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;
第一个权限与当前问题无关。 我尝试用第二个和第三个设置解决它,但它不起作用。
只有最后一个设置会有所帮助,但这样做很多...... 有更好的解决方案吗?
答案 0 :(得分: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.Class中
public Class [] getDeclaredClasses() public Field [] getDeclaredFields()
public Method [] getDeclaredMethods()
public Constructor [] getDeclaredConstructors()
public Field getDeclaredField(String name)
public方法getDeclaredMethod(...)
public Constructor getDeclaredConstructor(...)
需要权限
如果“this”类的类加载器与调用者的类加载器相同,则默认checkMemberAccess不需要任何权限。否则,它需要java.lang.RuntimePermission“accessDeclaredMembers”。如果此类在包中,则还需要java.lang.RuntimePermission“accessClassInPackage。{pkgName}”。
因此,您在策略文件中的注释条目似乎是正确的。如果取消注释这些行,它应解决此特定安全性异常,但您可能会遇到新的异常。
编辑:您说cou不能为您的应用程序指定代码库,但您至少应该能够指定指向特定jar文件的代码库,如下所示:
grant codeBase "file://file_url_to_jar" { }
它可能无法解决您的问题,但可以让您更进一步。
修改强>
如果所有其他方法都失败了,它仍然无效,您可以打开java安全性调试。它会产生大量输出,但它可以帮助追踪安全错误。通过将-Djava.security.debug=all
添加到JVM启动选项来启用它。
修改强>
对于此特定权限(accessDeclaredMembers
),可以通过将jackson jar添加到JVM的lib / ext文件夹来解决问题,因为这会使类加载与之相同的类加载器将跳过JRE类和accessDeclaredMembers
检查。