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. Bonjour,

      j'ai crée un compte sur Netlog , et je ne sais plus lire mes messages , il indique ACCESS DENIED !!

      Que faire?
      1. bon jour je suis débutante en langage java j'ai besouins des docummentation sur j_builder pour mon projet de fin d'études merci d'avance
        1. Contributeur
          Arrete de remonter des posts pour poser la même question et ouvre une discution correcpondant à ton attente ;)
      2. Bonjour à tous,

        J'ai lu tous les messages concernant RMI, et nul part vous ne mentionnez rmic, est ce normal ?

        J'essaie de réaliser un exemple mais ca ne marche pas. En utilisant rmic, il me dit qu'il ne trouve pas la classe. Pouvez-vous me dire comment utiliser rmic, et surtout s'il faut vraiment l'utiliser ?

        Merci d'avance pour votre aide,

        Vincent B
        1. bonjour,
          je tiens a te preciser que l'utilisation de rmic est primordiale dans la mesure ou cette commande te permet de generer les souches (stub et skeleton) qui vont permettre a ton client et ton serveur de communiquer.
          en ce qui est de l'utilisation de rmic, il faut tout d'abord compiler ton serveur
          javac nom_du_serveur.java
          ensuite generer les souches
          rmic nom_du_serveur
          tu aura alors 2 classes
          nom_du_serveur_stub.class
          nom_du_serveur_skel.class
        2. @Ganeshasalut!!

          t'as pas besoin de rmic si ton jdk est à partir de la version jdk 5 ou 1.5; c'est généré automatiquement voilà .
          sinon , il faut les générer
      3. bonjour
        je suis un debutant en java
        je n'arrive pas à utiliser jcreator
        je voudrais savoir comment on le configure
        1. bonjour
          je suis un debutant en java
          je n'arrive pas à utiliser jcreator
          je voudrais savoir comment on le configure
          1. Contributeur
            très bon plan ...
            Comme c'est du RMI, je la verrais bien après ta présentation RMI et juste avant celle sur .NET pour illustrer ... ça fait une petite pause 'pratique' entre des exposés assez théoriques et généraux je suppose ..
            c'est un simple avis :-))
            Les Web Services, c'est une bonne conclusion ...bien que ce soit pas encore super (pbs de sécurité, pas de standard pour l'implémentation SOAP, etc ...)

            Un petit conseil : il serait judicieux que tout soit prêt avant ta soutenance pour ne pas perdre de temps lors de celle-ci ... parce que je suppose qu'ils seront + interessés par les aspects théoriques (synthèse + compréhension du sujet) que par l'aspect pratique (surtout pour une formation de Chef de Projet où normalement tu ne développes plus beaucoup ...)

            Bonne chance pour ta soutenance ... et dis moi si ça s'est bien passé (ce que je ne doute pas)

            Bonne soirée

            @+

            sfx

            PS: je vais voir si je peux trouver quelque chose sous Linux pour MSN .. ;-))
            1. re,

              ce n'est pas indiscret du tout, ce rapport (enfin ils appelent cela un mémoire technique) c'est pour une école de Chargé de Projet en Info (bac +4) je viens d'avoir mon BTS mais moi j'étais "branchée" Admin Syst et Réseau donc j'ai eu droit à un maginique sujet Dev ; Comparaison entre les objets distribués : Corba, RMI, .NET

              Justement je me demandais pour la démo (excellente idée pour les 2 étapes, je vais le faire ça ;) ) quand est ce que je vais la faire...j'ai une heure (30 min français / 30 min anglais) donc déjà je vais la faire pendant le français!! mais je me demandais quand...
              voilà mon plan :

              Les objets Distribués
              Les systemes distribués
              Le marché des Obj Distribués
              CORBA
              RMI
              .NET
              Comparaison (fonctionnalités générales et coût de déploiement)
              Conclusion : Web services, avenir des Obj Dist ?

              Donc je sais pas trop où la situer cette démo...tu aurais une idée?

              Gaëlle

              PS : Mais sous Linux, je crois qu'il y a des prog du genre MSN où tu peux utiliser ton compte passeport ;)
              1. Contributeur
                ben si quand même .... tu appelles à partir de ton client une méthode de l'objet distant qui est sur le serveur (dans le serveur de noms rmiregistry ... ) ... c'est quand même du distribué, non ?

                Pour bien le montrer, tu peux le faire en deux étapes :
                * exécuter le client sans que le serveur soit démarré : tu auras alors une exception te disant que l'objet n'est pas accessible
                * puis démarrer le serveur et relancer le client et oh miracle ça marche .. ;-))

                C'est pas beau l'informatique ??

                sfx

                PS: si c'est pas indiscret,c'est pour quoi le rapport (fac, iut, ...) ?
                1. Merci,

                  je vais faire ça...enfin j'ai déjà une partie RMI qui explique tout mais sans aucun code, ça je vais le mettre en annexe avec à la fin un pti truc à propos du chargement dynamique (mise en place plus poussée).
                  Mais le problème c'est pendant ma démo...je vais leur dire quoi? "Comme vous voyez j'appelle HelloMain du client dont la classe est bein sur lui et je me connecte sur HelloImpl qui est sur l'autre pc dit serveur" C'est bien du RMI ça???? parce que là j'appelle quoi à distance?? rien du tout, non??
                  (ça me tracasse ..perfectionnsite! ;) )

                  Gaëlle
                  1. Contributeur
                    C'est un simple avis ..

                    Tu peux déja commencer par dire à quoi sert RMI, donner les protocoles impliqués, le principe et enfin le fonctionnement.
                    Ensuite donner les 6 étapes de création d'une application utilisant RMI en donnant en support ton exemple.
                    Enfin, tu dis, en approfondissement, qu'il y a d'autres possibilités comme RMI-IIOP, l'activation dynamique des objets avec juste le principe (mais pas de code ou uniquement des bouts de code ... pour donner un exemple)

                    Et voilà, ça devrait suffir pour ton prof, non ? (ça me rappelle de bons souvenirs ... :-))

                    sfx
                    1. Bon maintenant faut que je rédige un truc là-dessus à mettre en annexe de mon rapport...

                      Comment je peux tourner ça le fait que j'ai recopié des classes sur le client alors qu'avant je dis quil existe le chargement dynamique des stubs?

                      Gaëlle
                      1. Contributeur
                        Effectivement la solution de recopier les classes sur la machine cliente n'est pas très élégante ..
                        La méthode à mettre en oeuvre est le chargement dynamique des classes du côté client (pour qu'il récupère automatiquement les classes provenant du serveur) mais c'est plus compliqué et il faut le prévoir dès le début ...
                        Si tu veux regarder, jetes un coup d'oeil sur la classe Activatable du package java.rmi.activable, les groupes d'activation et
                        avec comme tu disais préalablement l'histoire du codeserver, etc ...
                        Par contre, il n'est pas nécessaire d'avoir un serveur web pour que ça marche :-)) (heureusement d'ailleurs)

                        Enfin, comme exercice pour démarrer Java, il y a quand même plus simple que RMI ... l'essentiel est que ton projet fonctionne pour la date prévue (demain je crois)

                        Bonnes Fêtes de Fin d'Année

                        @+

                        sfx

                        PS: je n'ai pas de compte sur MSN ... travaillant sous Unix/Linux ... ;-))
                        1. Alors,

                          quand je fais la cmd SET j'ai une erreur de synthaxe, que je le fasse avec CLASSPATH ou PATH.
                          Comme quand je fais echo %PATH% ça m'affiche le contenu de la variable PATH, j'ai fait pareil avec CLASSPATH mais ça me retourne "ECHO est actif"...donc bon..

                          Sinon j'ai recopié HelloImpl_Skel.class et HelloImpl_Stub.class dans C:\hello\rmidemo sur le client mais j'ai toujours la même erreur comme quoi il trouve pas la classe rmidemo/Hello (cette classe est sur le serveur...je peux pas out recopier après ça sera plus distribué!!! quoi que Hello.class c'est l'interface...il la faut peut etre...

                          Et bé je viens de recopier Hello.class dans C:\hello\rmidemo et ça marche!!! :)

                          Mais c'est distribué ça?? Ca utilise bien rmi??? Parce que c'est chiant de devoir recopier les classes...Imaginons pour un déploiement sur un parc de 100 machines!! C'est la galère!!!

                          En tout cas merci beaucoup de ton aode précieuse sfx, franchement je commencais à me décourager!

                          Gaëlle
                          1. re,

                            bon pour situer les choses sur mon pc "serveur", toutes les sources sont dans C:\test\rmidemo
                            Sur l'autre, le "client", HelloMain (.java et .class) est dans C:\hello\rmidemo

                            J'ai lancé le serveur avec la commande:
                            java -Djava.security.policy=java.policy -Djava.rmi.server.codebase=file:/192.168.0.5/test/ rmidemo.HelloImpl

                            (j'ai vu sur le net que
                            java -Djava.rmi.server.codebase=http://IP/PATH servait donc à indiquer à quelle endroit la machine virtuelle cliente va pouvoir chercher le code du stub et que c'est nécessaire si le client et le serveur ne sont pas sur la même machine... mais bon ils disent que c'est le chargement dynamique du stub mais avec un server web et http...

                            Ah je viens de recevoir un nouveau message de toi sfx, je fais ce que tu me dis et je te dis ce que ça fait!

                            (t'es pas connecté sur MSN?)

                            gaëlle
                            1. Contributeur
                              Pour connaitre ton CLASSPATH, tapes sur la ligne de commande :
                              (sous Windows) set CLASSPATH
                              (sous Unix) echo $CLASSPATH$

                              ça va te donner les différents répertoires que Java va parcourir pour trouver les classes qui lui manquent lors de l'exécution (ou la compilation) d'une appli.

                              (première solution)Tu dois recopier les classes (compilées) stub du serveur sur le client et ça devrait marcher ...
                              (seconde solution)Je dois voir tes classes Java parce que c'est un peu plus compliqué et il y a pas mal de modifs à faire :-((

                              sfx
                              1. Salut sfx,

                                bin oui, sur l'autre pc j'ai créé un rep rmidemo mais j'ai mis que le client dedans (HelloMain)...
                                pour le classpath je n'en sais rien.. :(
                                1. Contributeur
                                  Salut Gaelle,

                                  As-tu bien respecté la même arborescence, identique à celle que tu avais pour le cas ou le client et le serveur sont une même machine, i.e. repertoire rmidemo dans lequel il y a des classes compilées et tes stubs, pour la nouvelle machine distante ... parce que l'erreur que tu as est une erreur de chemin (class rmidemo/HelloMain not found) ...
                                  soit le CLASSPATH est mal positionné, soit l'arborescence ne correspond pas à tes classes compilées ...

                                  sfx (silfaxu@hotmail.com)
                                  1. Voilà ce que je viens de trouver sur le net:

                                    If the CLASSPATH environment variable on the server host includes the path of the remote object's stub classes, it will cause rmiregistry to ignore the java.rmi.server.codebase property setting for the server.

                                    rmiregistry must contain the location of the stub files for the remote server object in an HTTP URL-encoded format, so that when this information is sent to the client, the classes can then be downloaded via an HTTP server.

                                    If rmiregistry does not send the location of the stub classes in HTTP-encoded format, the client having no way to download them, will simply throw a ClassNotFoundException.


                                    je pense que ça correspondrait à mon cas.
                                    Est ce que quelqu'un pourrait me dire par étapes simples, ce qu'il faut faire alors?

                                    Gaëlle
                                    1. re,

                                      "Avant tu avais tout (serveur+client) sur la même machine et maintenant tu as un serveur (IP : 192.168.0.5) sur lequel tu fais tourner le serveur RMI
                                      et tu veux qu'une autre machine (distincte du serveur) contacte ce serveur ... c'est ça ? "
                                      --> oui

                                      "Tu as copié tes sources du client sur la nouvelle machine cliente, recompilé le tout et executer java rmidemo.HelloMain 192.168.0.5:1099 et tu as l'erreur que tu as décrite dans ton dernier message ... " --> j'ai juste copié HelloMain.java et HelloMain.class que j'ai mis dans un rep crée C:\hello...mais j'ai bien ce msg comme quoi il trouve pas la classe de HelloMain

                                      "Une solution est de rendre accessible sur la machine client via le CLASSPATH le bytecode (fichier .class) des fichiers stub du serveur ( solution la + simple mais pas très élégante vu que tu dois avoir accès au serveur ... ) " --> j'ai fait "C:\hello>java -cp . rmidemo.HelloMain 192.168.0.5 " mais ça change rien... J'ai meme fait "set CLASSPATH=c:\hello/" pour lui dire que c'est dedans qu'il y a HelloMain.java et helloMain.class mais toujours la même erreur.

                                      "PS: il est important d'executer rmiregistry depuis un répertoire qui ne contient aucune des classes devant être chargée à distance .. " --> je l'ai fait

                                      Je bloque complet là !!! ;(

                                      Gaëlle
                                      • 1
                                      • 2
                                      • 3