2010-03-11 60 views
16

嗨我试图启动一个RMI应用程序时得到一个AccessControlException: access denied我正在写,我不能解决为什么我得到这个异常,如果我打开它的默认端口1099,或在另一个动态端口上,我的策略文件当前授予一切(当应用程序完成时会改变)。Java RMI AccessControlException:访问被拒绝

我坚持为地方是哪里错了,任何帮助将是非常有用

我的代码

public class Main { 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) throws RemoteException, AlreadyBoundException, MalformedURLException { 
    if (System.getSecurityManager() == null) 
    { 
     System.setSecurityManager (new RMISecurityManager()); 
    } 

    CreditCardServer ccs = new CreditCardServer(); 

    int port = 1099; 

    try { 
     port = Integer.valueOf(args[0]); 
     } 
    catch (Exception e) 
     { 
     System.out.println("Invlaid Port"); 
     } 

    if (((port <= 65535) && (port >= 49152)) || port ==1099) 
    { 
    System.out.println("Valid Port"); 
    } 
    else 
    { 
     port = 1099; 
     System.out.println("Port not in Dynamic Range 49152<-->65535"); 
    } 

    System.out.println(port); 

    LocateRegistry.createRegistry(port); 

    LocateRegistry.getRegistry().bind("CreditCardServer", ccs); 

    while (true) 
    { 
     //hum? 
    } 
} 

}

堆栈跟踪

vega3 [ia32.linux] 23% java -Djava.security.policy=wideopen.policy -jar "BookStore-CreditCardServer.jar 65000" 

有效的端口

Exception in thread "main" java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:1099 connect,resolve) 
     at java.security.AccessControlContext.checkPermission(AccessControlContext.java:342) 
     at java.security.AccessController.checkPermission(AccessController.java:553) 
     at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) 
     at java.lang.SecurityManager.checkConnect(SecurityManager.java:1051) 
     at java.net.Socket.connect(Socket.java:536) 
     at java.net.Socket.connect(Socket.java:492) 
     at java.net.Socket.<init>(Socket.java:389) 
     at java.net.Socket.<init>(Socket.java:203) 
     at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40) 
     at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:146) 
     at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613) 
     at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216) 
     at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202) 
     at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:340) 
     at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source) 
     at bookstorecreditcardserver.Main.main(Main.java:56) 

我的政策文件

grant { 
// Allow everything for now 
permission java.security.AllPermission; 
}; 
+0

你可以在你的机器上做一个nmap来确保某个东西没有使用该端口(例如,你之前运行过这个程序,它并没有完全死掉)。 – Dave 2010-03-11 18:22:32

回答

3

基本上,我很愚蠢,我以为,因为Java是不是抱怨它找到.policy文件AOK ,事实证明它并没有将the.policy文件的新副本移动到工作目录中解决所有问题:-D

25

我一直卡在这个整天(在弄清楚我必须从命令行启动rmiregistry)之后,试图使用Eclipse在本地工作,并最终解决它。几个指针救别人这样残酷的命运:

1 - 正确分配策略文件,或者用命令行标志:

java -Djava.security.policy=/home/.../<filename>.policy ... 

或者把这个直接在您的代码:

System.setProperty("java.security.policy","file:///home/.../<filename>.policy"); 

您也可以将它放在与您的项目根目录相同的文件夹中),以将URI缩减为

file:./<filename>.policy 

(使用一个亲戚而不是绝对的URI - 直到今天我其实都不明白这一点)。

2 - 确保政策文件的格式是否正确,例如:

grant codeBase "file:<path>/bin/-" { 
    permission java.security.AllPermission; 
}; 

这应该是指在您的二进制文件所在的文件夹!对策略文件格式的详细解释是here

就是这样,我也推荐this tutorial,我发现它对正确的轨道非常有帮助。

+0

+1谢谢你对这个老问题的广泛回答,但仍然非常有效的问题Nauta&wecome。 – 2012-05-07 23:25:44

+0

策略文件链接格式的说明已过时。 – BlueDolphin 2015-01-02 19:08:54

+1

如何获得'security.policy'文件的正确路径? – CodyBugstein 2015-10-02 16:39:32

-1

我发现这个话题的大部分答案含糊不清,并花了几个小时来调试。很可能,您的错误是因为策略文件格式不正确,或者您没有将其设置为命令行参数。

如果你得到一个java.security.AccessControlException: access denied ("java.net.SocketPermission" "127.0.0.1:1099" "connect,resolve")

  1. 创建具有所有权限的安全策略文件,只是为了测试它

grant codeBase "file:/-" { permission java.security.AllPermission; };

  • 将此安全文件用于客户端和服务器,以使其运行。

  • 请确保您没有任何错别字。我花了几个小时试图弄清楚为什么它不工作,我输入了替代-Djava.security.policy = ...

  • 对于那些-Djava.rmi.security.policy我们只是想从Oracle获得RMI教程并运行,这个安全策略对于这个例子来说已经足够了。

    +0

    您的回答与六年前发布的[这一个](https://stackoverflow.com/a/10157900/207421)基本相同,既不模糊也不无益处。否则你的也是。 – EJP 2018-02-15 16:10:11

    +0

    花了几个小时来调试这个,我可以向你保证,这个问题需要更多的答案。我发现这一行特别广泛地解决了这个问题:“这应该指向您的二进制文件所在的文件夹!” – 2018-02-15 16:28:41

    相关问题