2010-03-11 58 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

    相關問題