2009-10-16 5 views
1

J'ai une applet Java s'exécutant sur tomcat 5.5. Il est signé (-selfcert). Je reçois encore une exception java.security.AccessControlException: access denied (java.lang.RuntimePermission createClassLoader), quand mon Applet essaie de se connecter à un webservice (déjà dans cette ligne):Une applet Java signée déclenche une exception de sécurité lors de la connexion à un service Web

ws_locator = new My_WebserviceLocator(ws_adress + "?wsdl", 
       new javax.xml.namespace.QName("http://impl.webservice", "My_Webservice")); 

Comme il y a des questions similaires ici, un je les lis:

  • Oui, l'applet est signée. Je l'ai vérifié avec -verify.

  • Tomcat exception de sécurité, peut-être, mais je dois ajouter à catalina.policy:

    grant codeBase "file:/home/me/apache-tomcat-5.5.27/webapps/myapplet/-" { 
        permission java.security.AllPermission; }; 
    

    grant codeBase "file:/home/me/apache-tomcat-5.5.27/webapps/myapplet/applet.jar" { permission java.security.AllPermission; };

et les trucs habituels comme est là:

grant codeBase "file:${java.home}/jre/lib/ext/-" { 
     permission java.security.AllPermission; 
}; 

sans résultat.

Ok, mise à jour rapide, en ajoutant:

grant{ 
     permission java.security.AllPermission; 
}; 

au fichier java.policy locale résout le problème. MAIS ce n'est pas ce que je cherche, l'applet devrait fonctionner sur une machine avarage, avec le fichier dafault java.policy. Donc, il doit être fixé à partir du code.

+0

donnez l'ensemble stacktrace + My_WebserviceLocator – Bozho

+0

bien, vous n'avez toujours pas donné la piletrace entière. – Bozho

+0

Wth. answear autosélectionné. C'est nul. – Red33mer

Répondre

8

Appelez-vous votre WS à partir du thread principal de l'applet ou à partir d'un thread initié par un appel à la méthode de l'applet en utilisant javascript?

Voir l'exemple ci-dessous.

Espérons que ça aide.

public class MyApplet extends JApplet { 

    @Override 
    public void start() { 
     // It will work if your applet is signed 
     callWebService(); 
    } 

    public void methodCalledFromJavascriptWrong() { 
     // It will NOT work even if your applet is signed 
     callWebService(); 

    } 

    public void methodCalledFromJavascriptGood() { 
     AccessController.doPrivileged(new PrivilegedAction() { 

      public Object run() { 
       // It will work if your applet is signed 
       callWebService(); 
       return null; 
      } 

     }); 

    } 

    private void callWebService() { 
     //Here you call your web service 
    } 
} 
+0

non ce n'est pas ça, l'applet ne démarre pas autrement, l'applet ne démarre pas et toutes les fonctionnalités fonctionnent en plus de créer ws_locator et de se connecter grossièrement au webservice – Red33mer

+0

Laurent K, pouvez-vous nous expliquer pourquoi? Y a-t-il des solutions de contournement pour cela, de sorte que je n'aurais pas à faire le tour d'action privilégié tout le temps? Où est-ce expliqué en détail? J'ai une applet qui appelle javax.smartcardio et la plupart du temps est appelée via Javascript. J'ai vu des astuces comme la création d'un fil d'accès privilégié pour l'accès par carte à puce, mais ce serait une sur-ingénierie pour moi. –

+0

Merci, c'était mon problème, les choses ne marchaient pas lorsqu'on les appelait depuis javascript. –

0

Si vous utilisez d'autres bibliothèques (pots) de votre applet, qui interract avec une ressource limitée, ils doivent également être signés. Donnez donc l'ensemble de la pile et le My_WebserviceLocator. (Et n'utilisez pas de traits de soulignement). Par exemple, essayez de signer le fichier axis.jar.

+0

comme je l'ai écrit dans un commentaire pour, une autre answear, l'applet ne démarre, il fait tout ce qui est censé faire, sauf si j'écris quelque part, n'importe où la ligne de code que vous voyez dans la question. Les stubs de service web axis2 aber générés automatiquement par le script wsdl2java à partir du site Web apache – Red33mer

+0

Si vos fichiers jar supplémentaires ne sont pas signés, l'applet démarre, mais échoue lorsque des actions nécessitant une autorisation sont tentées. – Bozho

+0

Essayez de signer l'axe.jar – Bozho

0

En tant que solution de contournement temporaire, vous pouvez désactiver le SecurityManager. Bien sûr, cela a quelques problèmes de sécurité, mais au moins vous serez en mesure de le retrouver dans le SecurityManager (c'est-à-dire, un problème d'autorisations).

System.setSecurityManager(null); 

Si cela fonctionne effectivement, je suppose que vous configurez le mauvais fichier de stratégie. Lors de l'exécution d'une applet à partir du navigateur, je suis presque sûr que le lanceur d'applet sera un JRE consommateur régulier, pas le jre livré avec le JDK.

+0

Vous ne pouvez pas modifier un gestionnaire de sécurité s'il y en a un actif. –

+0

IIRC, vous ne pourriez pas revenir en 1.00, mais vous pouvez (avec des privilèges suffisants) maintenant. J'aimerais que ça ne marche pas. Certains eejit décident que leur applet veut désactiver la sécurité, et il est désactivé pour tous les autres applets sur les interwebs. –

+0

Pourquoi le downvote? J'utilise moi-même cette technique avec java web start et applets. @Vous ne pouvez pas modifier un gestionnaire de sécurité lorsqu'il y en a un ** actif et ** vous n'avez pas les permissions pour le modifier. Outre ce n'est pas une solution, c'est un hack rapide pour déterminer si le bon fichier de politique est géré. –

0

La définition d'autorisations sur le serveur n'est pas la solution. C'est le gestionnaire de sécurité dans le navigateur qui se plaint.

L'utilisation proposée d'AccessManager est indead obligatoire ou cela échouera. Mais vous devez également faire de même lorsque vous appelez le service Web depuis start() ou init().

Puis-je demander: l'appel WebService est-il la seule raison pour laquelle vous avez une applet? Il peut être préférable de mettre en place une servlet proxy pour éviter les restrictions de politique de domaine identiques. Ensuite, vous pouvez utiliser du HTML pur + Javascript dans le navigateur.

L'appel d'une applet à partir de JS peut échouer si vous le faites avant le démarrage complet de l'applet. Vous devez donc attendre que l'applet soit prête.

Questions connexes