如何禁用Java安全管理器?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (20)

有什么办法可以完全禁用Java安全管理器吗?

我正在试验db4o的源代码。它使用反射来持久化对象,看起来安全管理器不允许反射来读写私有或受保护的字段。

我的代码:

public static void main(String[] args) throws IOException {
    System.out.println("start");
    new File( DB_FILE_NAME ).delete();
    ObjectContainer container = Db4o.openFile( DB_FILE_NAME );
    String ob = new String( "test" );
    container.store( ob );
    ObjectSet result = container.queryByExample( String.class );
    System.out.println( "retrieved (" + result.size() + "):" );
    while( result.hasNext() ) {
        System.out.println( result.next() );
    }
    container.close();
    System.out.println("finish");
}

输出:

开始
[db4o 7.4.68.12069 2009-04-18 00:21:30] 
 AccessibleObject#setAccessible()不可用。专用字段不能存储。
检索(0):
完

此线程建议修改java.policy文件以允许反射,但它似乎不适用于我。

我使用参数启动JVM, -Djava.security.manager -Djava.security.policy==/home/pablo/.java.policy 因此指定的策略文件将是唯一使用的策略文件

该文件如下所示:

授予{
    权限java.security.AllPermission;
    permission java.lang.reflect.ReflectPermission“suppressAccessChecks”;
};

我最近花了3个小时,并没有任何想法如何使这项工作。任何帮助赞赏。

提问于
用户回答回答于

你的java.security.policy命令行选项中是否真的有两个'='符号?这是行不通的。确保你将财产设置为

-Djava.security.policy=/home/pablo/.java.policy

要真正禁用SecurityManager,只需简单地将java.security.manager系统属性完全关闭即可。

当我阅读政策文件,以了解更多有关“==”语法的文档,我注意到,除非政策文件是在当前工作目录,它需要被指定为URL(包括方案)。您是否尝试过使用“file:”方案为策略路径添加前缀?

我也感到困惑,因为(假设你是以“pablo”用户身份运行的),看起来应该从你的主目录默认加载策略,所以你根本不需要指定它。另一方面,如果您没有以用户“pablo”的身份运行,那么该文件可能无法读取。

用户回答回答于

您可以尝试将其添加到程序的main()中:

System.setSecurityManager(null);

在我遇到安全管理员问题时为我工作了一个“可信”的WebStart应用程序。不知道它是否适用于您的db4o案例,但可能值得一试。

我不是暗示这是安全管理器问题的一般解决方案。我只是提出它作为帮助调试原始海报问题的一种方法。显然,如果你想从安全经理那里受益,那么你不应该禁用它。

扫码关注云+社区