Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何禁用Java安全管理器?_Java_Security_Reflection_Db4o - Fatal编程技术网

如何禁用Java安全管理器?

如何禁用Java安全管理器?,java,security,reflection,db4o,Java,Security,Reflection,Db4o,有没有办法完全禁用Java安全管理器 我正在试验db4o的源代码。它使用反射来持久化对象,而且安全管理器似乎不允许反射读取和写入私有或受保护的字段 我的代码: public static void main(String[] args) throws IOException { System.out.println("start"); new File( DB_FILE_NAME ).delete(); ObjectContainer container = Db4o.o

有没有办法完全禁用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");
}
输出:

start [db4o 7.4.68.12069 2009-04-18 00:21:30] AccessibleObject#setAccessible() is not available. Private fields can not be stored. retrieved (0): finish 我在这上面花了3个小时,不知道该怎么做。
非常感谢您的帮助。

您的
java.security.policy
命令行选项中真的有两个“=”符号吗?那不行。确保将属性设置为

-Djava.security.policy=/home/pablo/.java.policy
要真正禁用
SecurityManager
,只需完全关闭
java.security.manager
系统属性就足够了


更新:在阅读策略文件的文档以了解“==”语法的更多信息时,我注意到除非策略文件位于当前工作目录中,否则需要将其指定为URL(包括scheme)。您是否尝试过在策略路径前加上“file:”方案


我还感到困惑,因为(假设您是以用户“pablo”运行的),默认情况下,策略应该从主目录加载,所以您根本不需要指定它。另一方面,如果您不是以用户“pablo”的身份运行,则该文件可能不可读。

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

System.setSecurityManager(null);
在我遇到安全管理器问题时,曾为一个“受信任”的WebStart应用程序工作。不确定它是否适用于您的db4o案例,但可能值得一试


编辑:我并不是说这是安全管理器问题的通用解决方案。我只是想用它来帮助调试原始海报的问题。显然,如果您想从安全管理器中获益,那么就不应该禁用它。

我找到了这个示例,介绍了如何对代码进行修改。基本上,它归结为Field.setAccessible(true)和Method.setAccessible(true)的使用

现场示例:

Field privateStringField = PrivateObject.class.
            getDeclaredField("privateString");

privateStringField.setAccessible(true);
Method privateStringMethod = PrivateObject.class.
        getDeclaredMethod("getPrivateString", null);

privateStringMethod.setAccessible(true);
方法示例:

Field privateStringField = PrivateObject.class.
            getDeclaredField("privateString");

privateStringField.setAccessible(true);
Method privateStringMethod = PrivateObject.class.
        getDeclaredMethod("getPrivateString", null);

privateStringMethod.setAccessible(true);

您还可以考虑在Java代码中使用Groovy,因为它(目前)规避了Java代码的许多访问级别限制。尽管如此,这个留言板上的帖子似乎暗示了这个“功能”。

这不起作用。两者都不向JVM传递任何参数。顺便说一句,“==”表示指定的文件将是唯一使用的文件。单个“=”表示该文件将与标准策略文件一起使用。至少这是我读到的。您是否尝试过从自己的代码调用setAccessible或其他特权操作?完整的命令行可能也很有用。您的VM参数正确吗?您似乎有-Djava.security.policy==?@Brian:double'='表示指定的文件是唯一使用的策略文件。单个“=”表示指定的文件将与标准策略文件一起使用。至少这是我读到的。@Tom:我可以在我的代码中调用setAccessible,这很奇怪,因为我的代码是我在db4o源代码中添加的一个类。然而,同一个db4o似乎无法访问setaccessible。也许这是db4o中的一个bug?通常不建议这样做,因为恶意代码可以使用它来降低安全性并获得本地用户权限。原始海报希望“完全禁用”安全管理器!:-)谢谢,我在“受信任的”WebStart应用程序和调用系统中遇到异常;为meWell工作的安全管理器可以防止设置安全管理器,这对攻击者不利,但它允许创建一个“超级”安全管理器,该管理器在程序流的其余部分保持永久性。@gparyani:正确,谢谢。详细说明您的观点,程序必须具有
java.lang.RuntimePermission
setSecurityManager
权限,才能设置安全管理器。禁用安全管理器可以获得调用setAccessible(true)的权限。如果不禁用安全管理器,您就不会有祈祷了。@Kevin:我可以在自己的代码中为私有字段调用setAccessible。我所说的“我自己的代码”是指我添加到db4o源代码中的一个类。只要你没有像(+1)@extranon建议的那样在applet或其他有违反安全管理器的环境中运行代码,你就应该能够在代码中调用它。这篇artima文章很好地解释了Java Security Manager: