Java 是否有一种简单的方法来调查是否真的需要AccessController.doPrivileged()?
我有一段代码,它将JavaServer附加到RMI注册表,这是在PrivilegedAction中完成的Java 是否有一种简单的方法来调查是否真的需要AccessController.doPrivileged()?,java,Java,我有一段代码,它将JavaServer附加到RMI注册表,这是在PrivilegedAction中完成的 //start javaengineserver AccessController.doPrivileged(new PrivilegedAction() { public Object run() { try {
//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)方法后面的代码,没有发现任何看起来需要额外权限的内容,但是除了手动测试所有用法和功能之外,还有什么方法可以确认这一点吗
谢谢。我认为没有(可靠的)简单方法。但有一种不可靠的方法:暂时用只调用startServer
的代码替换该代码,然后尝试在安全沙箱中运行它
但是我怀疑需要调用
doPrivileged
。具有该名称和端口
参数的方法可能会尝试在服务器套接字
上创建/绑定/侦听。如果SecurityManager.checkListen
方法不允许该操作,则后者将失败。。。这在一个典型的沙箱中是做不到的。(我们通常不希望不受信任的代码能够启动隐形网络服务…非常感谢!实际上,该方法调用绑定xor或RMI注册表的重新绑定方法。我尝试在没有doPrivileged()方法的情况下启动它,但似乎一切都正常。。。根据SecurityManager和RMI.bind,我发现了一些问题,但通过调用具有特权访问权限的bind方法,这些问题似乎都没有得到解决。。。有些东西告诉我它是需要的,但是没有它它它运行得很好。@Oli-在幕后,那些RMI方法可能会进行serversocket绑定。或者,可能存在与RMI相关的特定许可。不管怎样,我想都有可能进行安全检查。如果您没有看到,请检查您正在使用的沙箱的策略设置。好的,那么如果策略设置足够严格,操作将在没有DoPrivileged的情况下失败?