web-dev-qa-db-fra.com

Java RMI AccessControlException: accès refusé

Hé, je reçois un AccessControlException: access denied lorsque j'essaie de démarrer une application RMI que j'écris, je ne peux pas comprendre pourquoi j'obtiens cette exception si je l'ouvre sur le port par défaut 1099 ou sur un autre port dynamique, mon fichier de stratégie accorde actuellement tout ( changer lorsque l'application est terminée).

Je ne sais pas où ça va mal, toute aide serait d'une grande utilité

Mon code

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?
     }
}

}

La trace de pile

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

Port valide

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)

Mon fichier de stratégie

grant {
// Allow everything for now
permission Java.security.AllPermission;
};
19
Gwilym

Fondamentalement, je suis stupide, j'ai supposé que parce que Java ne se plaignait pas qu'il trouvait le fichier .policy AOK, il s'avère qu'il ne déplaçait pas une nouvelle copie du fichier.policy dans le travail répertoire résout tous :-D

3
Gwilym

Je suis resté coincé là-dessus toute la journée (après avoir compris que je devais démarrer le rmiregistry à partir de la ligne de commande), essayant de faire fonctionner cela localement avec Eclipse, et finalement résolu. Quelques conseils pour sauver les autres de ce sort cruel:

1 - attribuez correctement le fichier de stratégie, soit avec un indicateur de ligne de commande:

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

ou en le mettant directement dans votre code:

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

Vous pouvez également le placer dans le même dossier que la racine de votre projet), pour réduire l'URI à

file:./<filename>.policy

(utilisez un URI relatif au lieu d'un URI absolu - je n'ai pas compris cela jusqu'à aujourd'hui).

2 - assurez-vous que le format du fichier de stratégie est correct, par exemple:

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

Cela devrait faire référence au dossier où se trouve votre binaire! Une explication approfondie du format du fichier de stratégie est ici .

C'est à peu près tout, je recommanderais aussi ce tutoriel , je l'ai trouvé très utile pour se mettre sur la bonne voie.

28
Dining Philosopher