Jackson在Domino XPage上的Java权限

时间:2013-04-02 08:41:51

标签: java security jackson

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

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

只有最后一个设置会有所帮助,但这样做很多...... 有更好的解决方案吗?

1 个答案:

答案 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检查。