Question

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

Je suis coincé à où il 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 dossier politique

grant {
// Allow everything for now
permission java.security.AllPermission;
};
Était-ce utile?

La solution 2

En fait, je suis stupide, je suppose que, parce que Java ne se plaignait pas, il a été de trouver le fichier .policy AOK, se révèle qu'il ne se déplaçait pas une nouvelle copie du the.policy fichier dans le répertoire de travail Résout tous :-D

Autres conseils

Je suis coincé (après déterminer que je devais commencer la rmiregistry de la ligne de commande) sur toute la journée, en essayant de faire ce travail au niveau local avec Eclipse, et enfin résolu. Quelques conseils pour sauver d'autres ce sort cruel:

1 - assigner correctement le fichier de stratégie, que ce soit avec un drapeau de ligne de commande:

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

ou en mettant directement ce dans votre code:

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

Vous pouvez aussi le mettre dans le même dossier que la racine de votre projet), afin de réduire l'URI

file:./<filename>.policy

(utilisez un parent au lieu d'URI absolu - En fait, je ne comprenais pas ce jusqu'à aujourd'hui)

.

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

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

Cela devrait se référer au dossier dans lequel votre binaire se trouve! Une explication approfondie du format du fichier de stratégie est ici .

C'est à ce sujet, je vous recommande également ce tutoriel, Je l'ai trouvé très utile pour obtenir sur la bonne voie.

Je trouve la plupart des réponses à ce sujet vagues et inutiles, et a passé plusieurs heures de débogage cela. Plus que probablement, votre erreur est parce que le fichier de stratégie est soit mal formaté ou que vous n'êtes pas le réglage correct comme un argument de ligne de commande.

Si vous obtenez un java.security.AccessControlException: access denied ("java.net.SocketPermission" "127.0.0.1:1099" "connect,resolve")

  1. Créez un fichier de politique de sécurité avec toutes les autorisations, juste pour le tester

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

  1. Utilisez ce fichier de sécurité pour le client et le serveur, juste pour le faire fonctionner.

  2. Assurez-vous que vous n'avez pas des fautes de frappe. Je passais des heures à essayer de comprendre pourquoi il ne fonctionnait pas, et j'avais tapé -Djava.rmi.security.policy au lieu de -Djava.security.policy = ...

Pour ceux d'entre nous qui veulent juste obtenir le tutoriel RMI à partir d'Oracle et en cours d'exécution, cette politique de sécurité sera plus que suffisant pour cet exemple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top