Débutante JAVA : Erreur

Bonjour à tous,

Je viens de faire un petit pgm "hello world" en java (C'est ma 1ere expérience en matière de prog).
Quand je lance le serveur j'ai l'erreur suivante :

java.security.AccessControlException: access denied
(java.net.SocketPermission 127.0.0.1:1099 connect,resolve)


J'ai trouvé sur le Net la solution, mais je n'arrive pas à comprendre ce qu'il faut faire (créer des fichiers? où ça? juste les modifier?..etc) Est ce quelqu'un pourrait me traduire de façon simple le etxte ci dessous pour savoir ce que je dois faire? merci d'avance...c'est un projet que je dois avoir terminé mercredi :(

Lorsque l'on essaie d'utiliser un SecurityManager, on obtient le message d'erreur suivant :
java.security.AccessControlException: access denied
(java.net.SocketPermission 127.0.0.1:1099 connect,resolve)

Modification par programme
System.setSecurityManager (new RMISecurityManager() {
public void checkConnect (String host, int port) {}
public void checkConnect (String host, int port, Object context) {}
});

Le fichier .java.policy
Les permissions du SecurityManager sont spécifiées dans l'ordre :

dans le fichier java.policy de ${java.home}/lib/security/java.policy

puis dans

${user.home}/.java.policy (attention au point !)

Les instructions du fichier policy
Le serveur doit pouvoir accepter des connexions d'un hôte particulier :

permission java.net.SocketPermission "sace.essi;fr", "accept";

ou de tous les hôtes et pouvoir faire resolve également :

permission java.net.SocketPermission "*", "accept, resolve";

Pour définir cela, lancer la commande (sous jdk/bin) (voir aussi "A quick look at policytool"):

policytool

et éditer le fichier .java.policy (sous Linux sous ~, sur PC sur c:\winnt\profiles\votreNomuser)


Merci encore pour votre aide

Gaëlle

45 réponses

Résumé de la discussion

Une erreur java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:1099 connect,resolve) survient lors du démarrage d’un serveur RMI en Java. Les solutions tournent autour du fichier java.policy (dans ${java.home}/lib/security/java.policy puis dans ${user.home}/.java.policy) pour accorder des permissions SocketPermission et l’usage éventuel de policytool pour modifier ce fichier. D'autres éléments clés: vérifier que le port dans le code et dans le fichier java.policy correspond au port attendu (1099 par défaut) et redémarrer rmiregistry après chaque modification. En pratique, la mise en place peut nécessiter policytool pour générer ou modifier un fichier .java.policy et s’assurer que les composants s’exécutent sur la même machine ou que les connexions entrantes soient autorisées.

Bobot (l’IA à votre service)
  1. Contributeur
    Salut,

    Il me semble que le port que tu utilises n'est pas le même dans le fichier HelloImpl (port 1000) et le fichier java.policy (port 1024 et suivant) ...
    De plus, le port normalement utilisé par RMI est le 1099 ...
    As-tu essayé le port par defaut (1099) à la fois dans le fichier java.policy et la classe HelloImpl ?
    De plus, tu écris que le fichier qui gère les permissions s'appelle java.policy et dans la ligne de commande qui démarre le serveur, tu as écris 'policy' et non java.policy ...

    Et n'oublie pas d'arrêter et de redemarrer le rmiregistry à chaque fois que tu modifies et donc recompile tes classes (de même si tu modifies le fichier java.policy)

    J'espere que ça t'aideras ...

    sfx
    1. Salut,

      Tu doit aller dans MSDOS
      vas dans demrrer/excuter/et tape command puis click ok
      pour aller à la racine tape cd.. quand tu est dans la racine
      soit C:\tape edit autoexec.bat editeur apparait en bleu
      et faut rajouter un ligne de code qui est :
      path=C:\JDK ou SDK autre\bin puis enregistrer le fichier
      et redamarrer l'ordinateur.

      toto.java compiler avec javac.toto.java
      pour le fichier class.

      Joyeux noël et bonne année vlt
      1. Contributeur
        Salut,

        Est-ce que le serveur et le client sont une seule et même machine ?
        Si non, le serveur est-il derrière un firewall ?

        sfx
        1. Bonjour..
          Je croie que vous pouvais m'aider ..
          Comment compiler un programme ecris en JAVA
          Répondez moi SVP..
        2. javac className.java
      2. Salut et merci à tous,

        vlt, j'ai déjà ajouter les cmd java dans la variable d'environnement PATH. Pour "toto.java compiler avec javac.toto.java
        pour le fichier class. " je ne vois pas le rapport.

        sfx, le client et le serveur sont sur la même machine, mais le but de ce programme car c'est du java avec RMI c'est que n'importe quel client puisse y accéder .

        idsp23, pour compiler un programme java, en ligne de commande tu tapes javac repertoireparent.nomduprogramme

        Sinon est ce que quell'un a réussi à décoder la soluce de mon probleme que j'ai trouvé sur le net?

        Gaëlle
        1. Merci Daëlle pour ta réponse, j'ai trouvé dans jcreator l'option de compilation, mais voilà j'ai un message d'erreur qui me demande de créer d'abord le "JDK Profile" ..?
          C quoi encore cela ?
          Merci d'avance..
          Idsp23
      3. configurer les variables d env sous windows :
        tu ouvres c:\autoexec.bat
        tu ajoutes les lignes
        set path = %path%;= $jdk_home$\bin
        set classpath = $jdk_home$\lib\tools.jar;. ($jdk_home$=
        rep ou java est installe et . le rep courant)
        tu redemarre ensuite et maintenant tu peux compiler ou excuter tes classes a partir de n importe quel rep

        pour compiler ton prg a partir de msdos tu te places dans le rep qui contient tes classes par ex toto.java et tu tapes
        javac toto.java
        pour executer
        java toto (pas d extension !)
        tu peux utiliser un editeur de texte comme textpad (fait 1 recherche sur le web)qui est gratuit et vachement pratique pour deboguer et executer tes prg (tu regardes dans le menu tools\run tu changes le rep courant et les champs adequats)
        la ligne de commande est fastidieuse surtout quand tu fais trop d erreur
        1. bonsoir tout le monde et merci pour toutes vos réponses,

          mais jevais devoir recentrer le sujet...je n'ai pas de probleme de varaible d'environnement et ttou et tout.

          je viens de créer mon 1er prog en java - rmi, point d'erreur à la compile ..mais une au lancement du serveur (tous les fichiers se trouvent sur la meme machine) :
          java.security.AccessControlException: access denied
          (java.net.SocketPermission 127.0.0.1:1099 connect,resolve)

          j'ai donc trouvé sur le net ce qui pourrait etre la solution mais du haut de mes 5 jours de java (c'est pour un projet pour mon école) je ne trouve pas ce que j'ai trouvé très claire..je demandais donc si quelqu'un saurait mexpliquer ce qui est dit dans le 1er msg de ce sujet en gras de façon claire. Si quelqu'un connait RMI (remote method invocation) merci de me faire un grand signe!! merci à tous et bisous

          Gaëlle
          1. Contributeur
            Salut,

            Ton problème vient du security manager que tu as mis en place ...
            Est-ce que tu lui précises quel fichier policy utiliser ? Pour être plus précis, est-ce que tu lui donne, dans ta ligne de commande, le fichier policy à utiliser ?
            (tu as un mot clé à utiliser dans ta ligne de commande)

            @+

            sfx
          2. Contributeur
            Salut,

            Il faut rajouter, dans ta ligne de commande qui démarre ton serveur, le texte suivant :
            -Djava.security.policy=<chemin relatif ou absolu de ton fichier java.policy>

            @+

            sfx
        2. Salut,

          merci à tous pour vos réponses, sfx je vais essayer ce que tu m'as dit ...idsp23 je ne connais pas la solution à ton problème...

          Merci également à la personne (désolée j'ai oublié le pseudo) qui m'as mit un lien vers un problème similaire.

          Je me penche dessus et je vous tiens au courant.

          A bientot
          Gaëlle
          1. Re les jeunes,
            alors voilà j'ai effectué quelques modifications en fonction de ce que j'ai trouvé sur Internet mais j'ai toujours un problème....

            j'ai modifié le java.policy avec la ligne

            permission java.net.SocketPermission "192.168.0.5:1024-", "listen,connect,resolve";

            J'ai créé dans mon package le fichier SecurityManagerPermissif.java

            package rmidemo

            import java.rmi.*;
            import java.security.*;

            public class SecurityManagerPermissif extends RMISecurityManager {

            public void checkPermission(Permission p) {
            //ne fait rien
            }
            }

            Je l'ai compilé sans difficulté.

            Et j'ai modifié le main de mon fichier HelloImpl.java

            public static void main(String args[])
            {
            if (System.getSecurityManager()== null) {
            System.setSecurityManager(new SecurityManagerPermissif());
            }
            try{
            HelloImpl obj = new HelloImpl("HelloServer");
            Naming.rebind("//192.168.0.5:1000/HelloServer", obj);
            System.out.println("HelloServer enregistré dans le registry");
            }
            catch (Exception e){
            System.out.println("HelloImpl err: " + e.getMessage());
            e.printStackTrace();
            }
            }
            }


            Quand je lance la commande:
            java -Djava.security.policy=policy rmidemo.SecurityManagerPermissif
            j'ai l'erreur suivante :

            Exception in thread "main" java.lang.NoSuchMethodError: main

            Je ne sais vraiment plus quoi faire...
            Un coup de main serait vraiment le bienvenu

            Gaëlle
            1. Contributeur
              Salut Gaelle,

              La méthode main n'est pas dans ta classe SecurityManagerPermissif mais dans la classe HelloImpl ....

              Tu dois donc executer le fichier rmidemo.HelloImpl et non SecurityManagerPermissif (qui est appelé par HelloImpl)

              sfx
              1. Re sfx, merci encore pour toutes réponses, ça me panique un peu moins , je me sens moins seule ;)

                Alors j'ai donc éxecuter ceci

                C:\TEST>java -Djava.security.policy=policy rmidemo.HelloImpl

                et voici l'erreur (nouvelle )

                Exception in thread "main" java.lang.Error: ProblÞme de compilation non rÚsolu :

                Erreur de syntaxe sur le mot clÚ "import"; ";" attendu

                at rmidemo.SecurityManagerPermissif.<init>(SecurityManagerPermissif.java
                :3)
                at rmidemo.HelloImpl.main(HelloImpl.java:21)


                pour la premier erreur à propos de import c'est bien rédigé je comprends pas, je te mets ci dessous le SecurityManagerPermissif

                package rmidemo

                import java.rmi.*;
                import java.security.*;

                public class SecurityManagerPermissif extends RMISecurityManager {

                public void checkPermission(Permission p) {
                //ne fait rien
                }
                }


                Poiur l'autre erreur dans le main, il est dans mon msg précédent mais je vois pas non plus pourquoi ça coinceet ce qu'il faut faire.

                Gaëlle
                1. Contributeur
                  Salut,

                  Il faut un ';' à la fin de la ligne
                  package rmidemo

                  @+

                  sfx
              2. Merci sfx ,

                bon après avoir corrigé cette erreur, voilà on msg qui revient :

                C:\TEST>java -Djava.security.policy=policy rmidemo.HelloImpl
                HelloImpl err: Connection refused to host: 192.168.0.5; nested exception is:
                java.net.ConnectException: Connection refused: connect
                java.rmi.ConnectException: Connection refused to host: 192.168.0.5; nested excep
                tion is:
                java.net.ConnectException: Connection refused: connect
                java.net.ConnectException: Connection refused: connect
                at java.net.PlainSocketImpl.socketConnect(Native Method)
                at java.net.PlainSocketImpl.doConnect(Unknown Source)
                at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
                at java.net.PlainSocketImpl.connect(Unknown Source)
                at java.net.Socket.<init>(Unknown Source)
                at java.net.Socket.<init>(Unknown Source)
                at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown S
                ource)
                at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown S
                ource)
                at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
                at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
                at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
                at sun.rmi.server.UnicastRef.newCall(Unknown Source)
                at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
                at java.rmi.Naming.rebind(Unknown Source)
                at rmidemo.HelloImpl.main(HelloImpl.java:25)


                retour à la case départ on dirait! :(

                Gaëlle
                1. donc j'ai essayé en lancant rmiregistry sur le port 1000

                  C:\TEST>java -Djava.security.policy=policy rmidemo.HelloImpl
                  HelloServer enregistrÚ dans le registry


                  c'est bien ce que j'avais mis dans HelloImpl

                  public static void main(String args[])
                  {
                  //
                  //cré et installe un security manager
                  //
                  if (System.getSecurityManager() == null) {
                  System.setSecurityManager(new SecurityManagerPermissif());
                  }
                  try{
                  HelloImpl obj = new HelloImpl("HelloServer");
                  Naming.rebind("//192.168.0.5:1000/HelloServer", obj);
                  System.out.println("HelloServer enregistré dans le registry");
                  }
                  catch (Exception e){
                  System.out.println("HelloImpl err: " + e.getMessage());
                  e.printStackTrace();
                  }
                  }
                  }
                  alors après je lance index.html parce que c'est fait avec un applet

                  //HelloApplet.java
                  //
                  package rmidemo;
                  import java.awt.Graphics;
                  import java.rmi.Naming;
                  public class HelloApplet extends java.applet.Applet {
                  String message = "";
                  public void init() {
                  try {
                  Hello obj = (Hello)Naming.lookup("//" +
                  getCodeBase().getHost() + "/HelloServer");
                  message = obj.sayHello();
                  } catch (Exception e) {
                  System.out.println("HelloApplet exception: " +
                  e.getMessage());
                  e.printStackTrace();
                  }
                  }
                  public void paint (Graphics g) {
                  g.drawString(message, 25, 50);
                  }
                  }


                  Il me dit que l'applet est démarré mais ya rien qui s'affiche et là ya une console java qui lance et dedans j'ai un msg d'erreur :

                  HelloApplet exception: Connection refused to host: 192.168.0.5; nested exception is:
                  java.net.ConnectException: Connection refused: connect

                  java.rmi.ConnectException: Connection refused to host: 192.168.0.5; nested exception is:
                  java.net.ConnectException: Connection refused: connect

                  java.net.ConnectException: Connection refused: connect

                  at java.net.PlainSocketImpl.socketConnect(Native Method)

                  at java.net.PlainSocketImpl.doConnect(Unknown Source)

                  at java.net.PlainSocketImpl.connectToAddress(Unknown Source)

                  at java.net.PlainSocketImpl.connect(Unknown Source)

                  at java.net.Socket.<init>(Unknown Source)

                  at java.net.Socket.<init>(Unknown Source)

                  at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown Source)

                  at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source)

                  at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)

                  at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)

                  at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)

                  at sun.rmi.server.UnicastRef.newCall(Unknown Source)

                  at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)

                  at java.rmi.Naming.lookup(Unknown Source)

                  at rmidemo.HelloApplet.init(HelloApplet.java:10)

                  at sun.applet.AppletPanel.run(Unknown Source)

                  at java.lang.Thread.run(Unknown Source)


                  Tu me dis "De plus, tu écris que le fichier qui gère les permissions s'appelle java.policy et dans la ligne de commande qui démarre le serveur, tu as écris 'policy' et non java.policy ... "...euh..faudrait que j'écive quoi alors?????

                  Gaëlle
                  1. en tapant
                    java -Djava.security.policy=java.policy rmidemo.HelloImpl

                    la meme erreur qu'au msg ci-dessus... ;(

                    Merci pour ton attention sfx...je commence à désespérer là!

                    Gaëlle
                    1. Contributeur
                      Salut Gaelle,

                      Essaie de changer le numéro de port ... essaie avec 1099 ( les ports en dessous de 1024 posent un problème quelque fois ...)

                      sfx
                      1. Contributeur
                        Resalut,

                        Tu peux aussi modifier ton fichier java.policy en mettant comme unique permission celle-ci :

                        grant {
                        permission java.security.AllPermission;
                        };

                        Ce qui donne tous les droits pour n'importe quel port ... c'est juste un test ... A ne surtout pas utiliser dans le cadre d'une appli réelle ... ;-))

                        @+

                        sfx
                        1. Salut,

                          ça fonctionne en faisaint tout passer par le port 1099, merci :)

                          Mais maintenant j'ai un autre problème, moi j'ai fait ça avec un applet mais en fait il faut un client applicatif tout court parce que le but c'est qu'à partir d'un autre poste et bien ça m'affiche Hello World...Je me mets sur le client de suite et je vous teins au courant, car je pense rencontrer (encore!!) des difficultées.

                          Gaëlle
                          1. Resalut,

                            voilà j'ai fait un client, enfin on m'avait fourni le code mais j'ai des petites erreurs dedans :

                            //HelloMain.java
                            //
                            package rmidemo;

                            import java.rmi.Naming;

                            public class HelloMain {
                            public static void main(String[] args) {
                            try {
                            Hello obj = (Hello)Naming.lookup("//"+args[0]+"/HelloServer");
                            message = obj.sayHello();
                            System.out.println("Le message est: "+message);
                            } catch (Exception e) {
                            System.out.println("HelloMain exception: "+e.getMessage());
                            e.printStackTrace();
                            }
                            }

                            }


                            Les erreurs sont à aux lignes suivantes:

                            message = obj.sayHello();
                            System.out.println("Le message est: "+message);


                            on me dit que message ne peut pas être résolu :(

                            Gaëlle
                            1. Resalut,

                              voilà j'ai fait un client, enfin on m'avait fourni le code mais j'ai des petites erreurs dedans :

                              //HelloMain.java
                              //
                              package rmidemo;

                              import java.rmi.Naming;

                              public class HelloMain {
                              public static void main(String[] args) {
                              try {
                              Hello obj = (Hello)Naming.lookup("//"+args[0]+"/HelloServer");
                              message = obj.sayHello();
                              System.out.println("Le message est: "+message);
                              } catch (Exception e) {
                              System.out.println("HelloMain exception: "+e.getMessage());
                              e.printStackTrace();
                              }
                              }

                              }


                              Les erreurs sont à aux lignes suivantes:

                              message = obj.sayHello();
                              System.out.println("Le message est: "+message);


                              on me dit que message ne peut pas être résolu :(

                              Gaëlle
                              1. Contributeur
                                Salut,

                                Une bonne chose de faite ... Les ports en dessous de 1024 sont (en général) réservés pour d'autres protocoles et uniquement accessibles par des processus systèmes (sous Unix ... sous Windows, je suppose que c'est plus ou moins la même chose)
                                Peux-tu donner le message d'erreur (complet) que tu as maintenant ?

                                sfx
                              2. ça c'est parceque la vble message n'est pas déclarée d'avance
                            2. RE tout le monde et surtout toua sfx ;)

                              pour windows aussi les ports jusqu'à 1024 sont en général réservés mais je n'y avais pas pensé ;)

                              En fait, c'était une erreur , j'ai trouvé, il fgallait mettre
                              String message = obj.sayHello(); y'avait pas le String.

                              Par contre maintenant je sais pas comment me connecter avec le client...j'ai lancé le registry, le serveur tout passe..

                              mais alors et pour le client?? dans un premier temps à partir de mon poste où il y a le serveur qui tourne, et puis bien sur à partir d'un autre pc connecté sur le même Lan? Tu sais comment je dois faire?

                              Gaëlle
                              1. re,

                                en lançant le client comme ça ( à partir du pc où il y a tout)

                                C:\TEST>java rmidemo.HelloMain

                                voilà l'erreur :

                                HelloMain exception: null
                                java.lang.ArrayIndexOutOfBoundsException
                                at rmidemo.HelloMain.main(HelloMain.java:10)


                                Gaëlle
                                1. Contributeur
                                  Salut Gaelle,

                                  C'est normal ... tu dois donner en paramètre le serveur à contacter ... (c'est args[0] de ton client) ....

                                  java demormi.HelloMain localhost
                                  ou
                                  java demormi.HelloMain 127.0.0.1

                                  sfx
                              • 1
                              • 2
                              • 3