web-dev-qa-db-ja.com

Java RMI AccessControlException:アクセスが拒否されました

ねえ、AccessControlException: access denied作成中のRMIアプリを起動しようとしたときに、デフォルトのポート1099または別の動的ポートで開いた場合、なぜこの例外が発生するのか理解できません。現在、ポリシーファイルはすべてを許可しています(アプリが終了したら変更します)。

私はそれがどこでうまくいかないのかについて立ち往生しています、どんな助けも大いに役立ちます

マイコード

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"

有効なポート

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;
};
19
Gwilym

基本的に、私は愚かです、Javaは.policyファイルのAOKを見つけることについて不平を言っていなかったので、.policyファイルの新しいコピーを作業用に移動していないことがわかりましたディレクトリはすべてを解決します:-D

3
Gwilym

私はこれに終始(コマンドラインからrmiregistryを開始する必要があると考えた後)、これをEclipseでローカルに機能させようと試み、ついに解決しました。この残酷な運命を他の人たちに救うためのいくつかの指針:

1-コマンドラインフラグを使用して、ポリシーファイルを正しく割り当てます。

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

または、これをコードに直接挿入します。

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

URIを次のように減らすために、プロジェクトのルートと同じフォルダーに置くこともできます)

file:./<filename>.policy

(絶対URIの代わりに相対URIを使用します-私は実際に今日までこれを理解しませんでした).

2-ポリシーファイルの形式が正しいことを確認します。例:

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

これは、バイナリが配置されているフォルダを参照する必要があります!ポリシーファイルのフォーマットの完全な説明は here です。

それはそれについてです、私はまたお勧めします このチュートリアル 、私は正しい軌道に乗ることが非常に役立つとわかりました。

28