无法为Intranet小程序配置AllPermission。 有人可以帮忙吗?

经过大量的阅读和测试后,我无法通过codeBase grant选项向Intranet applet授予所有权限。 这个小程序需要完全权限,因为它必须为OCR阅读器(也将图像文件写入HDD)和其他此类外部设备的访问驱动程序库。

我已经配置了我的java.policy文件并添加了以下内容:

grant codebase " http://myIntranetServer/- " { permission java.security.AllPermission; };

在控制台中重新加载策略文件,甚至重新启动浏览器之后,我得到了一个java.security.AccessControlException:对我的许多操作都拒绝访问,包括读取默认情况下未授予的“user.name”系统属性。

为了调试我也尝试默认提供所有权限并且它有效,所以我的问题基本上与de codeBase选项有关。 我使用JRE1.6-u17运行Windows 7和Linux客户端,两者都具有相同的行为。

有人可以帮忙吗?

提前致谢,

MadeiraA

我不确定我是否理解你的上一条评论。 当你说两个(对我来说)不同的东西:

  • 你使用plugin.jar(这意味着你的java调用javascript函数)
  • 我从Javascript调用相同的函数 ”(这意味着你的javascript调用java函数)

我认为后者是正确的解释。

如果你只是调用java方法(通过liveconnect),这些方法没有做任何安全相关的事情就可以了。 你可以这样做(假设applet的id="myapplet"myapplet.safeMethod(); 直接在您的JavaScript代码中。

从javascript调用java方法(通常限制applet的东西)的主要问题是调用似乎在JVM中的不同上下文中运行,然后是applet本身。 因此被视为无特权代码,您将获得AccessControlException 。 例如,在我的其他答案中,由applet本身执行的方法,获得正确的权限并执行。

现在,如果您在第2.8节“Java-to-Java调用的安全模型”中阅读新Java™插件技术中的LiveConnect支持 SUN状态

当进行JavaScript到Java调用时,JavaScript代码被建模为好像它来自不受信任的applet,其代码源是文档库(即包含文档的目录的URL)。

我把它读成:如果applet和javascript来自同一个站点,那么javascript-to-java调用应该以与applet本身相同的权限运行。 在我们的案例中,这意味着我们在grant设置的任何权利。

但这只适用于Opera。 FF和IE6都抛出AccessControlException 。 但它可能仍适用于所有浏览器。

以下代码有两个方法userName2()userName()userName2()所有浏览器中的WFM。 userName()仅适用于Opera。 通过按html页面上的按钮进行检查。

正如您所看到的, userName2()不适用于真实用例(只能调用一次)。 但是,当遇到类似问题时,您可以查看其他人提出的解决方案,并相应地扩展userName2()

使用LiveConnect的Java Applet

另外你可能会考虑我没试过的东西。 来自javascript-to-java的所有调用都不执行任何与安全性相关的操作(如果需要)传入数据并立即返回。 然后applet完成实际工作(如上面显示的链接)。 然后完成后,applet可以通过JSObjectplugin.jar )将回调激活到html页面

TestApp.java

 import java.applet.Applet; import java.awt.*; import java.security.AccessControlException; public class TestApp extends Applet { Label output = new Label("What is the value of user.name?"); String userName; Thread access = new Thread() { @Override public void run() { try { userName = System.getProperty("user.name"); } catch (AccessControlException e) { userName = "Oops, failed in thread. No read permissions!"; } } }; public void init() { setLayout(new BorderLayout()); add(BorderLayout.CENTER, output); } public String userName2() throws InterruptedException { access.start(); access.join(); output.setText(userName); return userName; } public String userName() { String userName = "Oops, failed in liveconnect-context. No read permissions!"; try { userName = System.getProperty("user.name"); } catch (AccessControlException e) { e.printStackTrace(); } output.setText(userName); return userName; } } 

的test.html

 test 

策略: .java.policy (在C:/ Documents and Settings / [USERNAME]中手动创建/注意前导.

 grant codeBase "http://[domain].xxx/-" { permission java.util.PropertyPermission "user.name", "read"; }; 

现在自己试了一下。

  • 类文件+ html文件位于服务器http://[domain].xxx/~someusername/somefolder/
  • 类文件+ html文件位于本地文件系统C:/Documents and Settings/[USERNAME]/Desktop/somefolder

策略: .java.policy (位于C:/ Documents and Settings / [USERNAME] /。注意领先.

使用这些小程序时工作并显示[USERNAME]

 grant codeBase "file:///-" { permission java.util.PropertyPermission "user.name", "read"; }; grant codeBase "http://[domain].xxx/-" { permission java.util.PropertyPermission "user.name", "read"; }; 

然后使用这些(在java控制台中重新加载的策略文件)applet无法显示[USERNAME]

 grant codeBase "file:///c/*" { permission java.util.PropertyPermission "user.name", "read"; }; grant codeBase "http://[domain].xxx/*" { permission java.util.PropertyPermission "user.name", "read"; }; 

Appelt: TestApp.java

 import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.security.*; public class TestApp extends Applet { Label output = new Label("What is the value of user.name?"); public void init() { Button button = new Button("Click me!"); setLayout(new BorderLayout()); add(BorderLayout.NORTH, button); add(BorderLayout.CENTER, output); button.addActionListener( new ActionListener() { @Override public void actionPerformed( ActionEvent ev ) { try { output.setText(System.getProperty("user.name")); } catch (AccessControlException e) { output.setText("Oops, failed. No read permissions"); } } } ); } } 

HTML: index.html

    

我现在有点困惑。 您声明上述grant声明不起作用,并在同一时刻声明“默认授予所有权限……有效”?

几个问题

  • 你使用的是什么浏览器?
  • 你编辑了哪个java.policy文件/你把它放在哪里
  • URL真的是什么样子? myIntranetServer可以通过DNS解决吗? 如果没有,也许java在应用规则时有一些问题