2013-08-16 31 views
0

我有这样的代码,重视一个JavaServer到rmiregistry,这是在一个PrivilegedAction有没有简单的方法来调查是否真的需要AccessController.doPrivileged()?

 //start javaengineserver 
     AccessController.doPrivileged(new PrivilegedAction() 
     { 
      public Object run() 
      { 
       try 
       { 
        startServer(port, getSession()); 
       } catch (RmiException e) 
       { 
        e.printStackTrace(); 
        AWTSwingErrorDialog.show(e, "Error while attaching JavaEngineServer to rmiregistry.exe"); 
       } 
       return null; 
      } 
     }); 

我发现对doPrivileged方法的一些其他问题做了,他们都表示,有一些系统管理命令需要额外的像获取环境变量一样的权限。

因此,我看了扔在startServer(port, session)方法背后的代码,我还没有发现任何看起来需要额外的权限,但有没有办法确认,除了手动测试所有的用法和功能?

谢谢。

回答

1

我不认为有一个(可靠的)简单的方法。不过,有一种不可靠的方法:暂时用一些只调用startServer的代码替换该代码,然后尝试在安全沙箱中运行它。

我怀疑需要doPrivileged调用。具有该名称和port参数的方法很可能会尝试在ServerSocket上创建/绑定/侦听。如果SecurityManager.checkListen方法不允许在典型沙箱中不执行的操作,则后者将失败。 (我们通常不希望不可信的代码能够启动隐形网络服务......)

+0

非常感谢!实际上,该方法调用RMI注册表的绑定异或重新绑定方法。我试着在没有doPrivileged()方法的情况下启动它,并且一切都似乎正常工作......并且我根据SecurityManager和RMI.bind发现了一些问题,但通过调用具有特权访问的bind方法似乎没有一个问题得到解决。有些东西告诉我它是需要的,但它运行良好,没有它.. – Oli

+0

@Oli - 在封面之下,那些RMI方法可能会做一个serversocket绑定。或者,可能会有与RMI相关的特定权限。无论哪种方式,我认为可能会进行安全检查。如果您没有看到,请检查您使用的沙箱的策略设置。 –

+0

没问题,所以如果策略设置足够紧密,那么操作将会失败,如果没有特权? – Oli

相关问题