我们正在开发一个applet,需要它能够读取/写入用户临时文件目录中的文件(例如C:\ Documents and Settings \ USERNAME \ Local Settings \ Temp)。
小程序已签名,用户在applet启动时单击“允许”选项,Java控制面板具有“允许用户授予对已签名内容的权限”和“允许用户向不受信任的权限授予内容权限”启用。
但是,在启动时,我们得到一个SecurityException:
java.lang.SecurityException: Unable to create temporary file
at java.io.File.checkAndCreate(Unknown Source)
at java.io.File.createTempFile(Unknown Source)
at java.io.File.createTempFile(Unknown Source)
at com.jniwrapper.util.AppletHelper.b(SourceFile:104)
at com.jniwrapper.util.AppletHelper.a(SourceFile:79)
at com.jniwrapper.util.AppletHelper.b(SourceFile:50)
at com.jniwrapper.util.AppletHelper.init(SourceFile:122)
at com.x.Y.init(Y.java:31)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Exception: java.lang.SecurityException: Unable to create temporary file
如果我们编辑java.policy文件以将所有内容授予所有内容,那么applet工作正常,但这显然是不安全的。我们必须授予哪些最小权限才能允许applet在用户的临时文件目录中读/写/创建文件?
答案 0 :(得分:6)
使用策略文件可以进行测试,但是您不应该依赖它来完成代码,特别是在授予文件权限时,这很危险。
要与文件进行交互,您需要执行以下操作。
签署你的jar - 大量的教程,如this,你可以做一个自签名的教程。
将文件创建代码添加到特权块这里是一个示例
File myFile = (File) AccessController.doPrivileged(new PrivilegedAction() {
public Object run()
{
return new File("C:\\MyFolder\\MyFile");
}
});
答案 1 :(得分:0)
得到同样的观点。要尽可能接近最低限度地授予权限,您可以在FilePermission
上授予${java.io.tmpdir}\-
行为read,write,delete
。这对我有用。
当然,您必须将${...}
替换为系统属性java.io.tmpdir
的值。 java.io.File.createTempFile
使用此属性。
注意:使用someDir\-
,您可以授予对someDir
路径的所有子目录的递归访问权限。此时您可以使用someDir\*
,但我还没有测试过它。
如果您使用策略文件授予权限,那么这些文件很可能已经支持引用系统属性。但谷歌再次确定。如果您使用自定义策略实施,则可以轻松创建权限java.io.FilePermission
。