Didacticiel Java RMI - AccessControlException: accès refusé (java.io.FilePermission
Hier, j'ai essayé de démarrer avec Java RMI. J'ai trouvé ce soleil tutoriel (http://java.sun.com/docs/books/tutorial/rmi/index.html) et a commencé avec le serveur de mise. Mais chaque fois que je le pogram (rmiregistry est en cours d'exécution), je reçois un AccessControlException avec le suivant StackTrace:
LoginImpl exception:
java.security.AccessControlException: access denied (java.io.FilePermission \\\C\ProjX\server\serverProj\bin\usermanager read)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:264)
at java.security.AccessController.checkPermission(AccessController.java:427)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.SecurityManager.checkRead(SecurityManager.java:871)
at java.io.File.exists(File.java:700)
at sun.net.www.protocol.file.Handler.openConnection(Handler.java:80)
at sun.net.www.protocol.file.Handler.openConnection(Handler.java:55)
at java.net.URL.openConnection(URL.java:943)
at sun.rmi.server.LoaderHandler.addPermissionsForURLs(LoaderHandler.java:1020)
at sun.rmi.server.LoaderHandler.access$300(LoaderHandler.java:52)
at sun.rmi.server.LoaderHandler$Loader.<init>(LoaderHandler.java:1108)
at sun.rmi.server.LoaderHandler$Loader.<init>(LoaderHandler.java:1089)
at sun.rmi.server.LoaderHandler$1.run(LoaderHandler.java:861)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.server.LoaderHandler.lookupLoader(LoaderHandler.java:858)
at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:541)
at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:628)
at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:294)
at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:238)
at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1494)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1457)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1693)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)
at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:375)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:240)
at sun.rmi.transport.Transport$1.run(Transport.java:153)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:460)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:701)
at java.lang.Thread.run(Thread.java:595)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source)
at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
at startserver.StartServer.main(StartServer.java:22)
Mon serveur.la politique de fichier ressemble à ceci:
grant {
permission java.security.AllPermission;
};
Mais j'ai aussi essayé celui-ci ...
grant {
permission java.security.AllPermission;
permission java.io.FilePermission "file://C:/ProjX/server/serverProj/bin/usermanager", "read";
};
... et celui-ci (et plusieurs autres): - ():
grant codeBase "file:///-" {
permission java.security.AllPermission;
};
Mais dans tous les cas, le résultat est le même. Et oui, le fichier de stratégie est en chemin (je vois un Parse Exception, quand j'écris mal relevés dans la politique de fichier). J'ai essayé plusieurs autres "/" et "\" constellations, mais il n'a pas d'effet.
J'utilise Eclipse et ma VM-Paramètres comme ceci:
-cp C:\ProjX\server\serverProj\bin\usermanager\
-Djava.rmi.server.codebase=file://C:/ProjX/server/serverProj/bin/usermanager/
-Djava.rmi.server.hostname=XYZ (anonymized)
-Djava.security.policy=server.policy
Compilées à Distance de l'Interface et l'interface de mise en œuvre de la classe (LoginImpl) les classes sont dans cette voie: "C:/ProjX/server/serverProj/bin/usermanager/". La méthode principale, où je l'instancier et relier le stub dans le registre dans un autre package et ressemble à ceci:
public static void main(String[] args) {
if (System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManager());
}
try {
String name = "Login";
Login login = new LoginImpl();
Login stub = (Login) UnicastRemoteObject.exportObject(login, 0);
Registry registry = LocateRegistry.getRegistry();
registry.rebind(name, stub);
System.out.println("LoginImpl bound");
} catch (Exception e) {
System.err.println("LoginImpl exception:");
e.printStackTrace();
}
}
N'quelqu'un a un conseil pour moi? Je vous remercie pour l'aide.
Donc la question est la même (la java.rmi.UnmarshalException montre que la modification de la base de code n'est pas la solution de mon AccessControlException). Et non: je ne veux pas acheter un plugin "G B" ;-).
source d'informationauteur user25913
Vous devez vous connecter pour publier un commentaire.
Octroi de toutes les autorisations pour tout le code est vraiment mauvais. Toute RMI client pourrait faire ce qu'il voulait que l'utilisateur connecté. En général, essayez de limiter les autorisations d'autant que raisonnable, en particulier lorsque vous ne savez pas où le code a viennent de.
Revenir à la question...
Qui devrait être
"file:///C:/..."
ou"file:/C:/..."
. Pensez à http."http://C:/..."
se réfère à un hôte nomméC
. Notez que le message d'exception a abandonné le côlon, parce que c'est juste la syntaxe pour le numéro de port.La raison pourquoi vous obtenez une exception de sécurité, même si vous accordez des autorisations à tout le code, c'est que le RMI est la restriction des autorisations appropriées compte tenu de l'Url impliqués (à l'aide de AccessController doPrivileged deux argument forme).
Ok, je l'ai. Il n'était pas le rmiregistry propriété (fonctionne sans paramètres). Il y avait deux erreurs dans mon code VM-Paramètre:
... devrait plutôt ressembler à ceci:
=> file:/(une seule barre oblique) + mauvais package fin.
Mais la trace était si confus, ma première pensée a été que quelque chose doit être mal avec la politique ou de la politique de la configuration.
Néanmoins: je vous Remercie pour l'aide et heureux de piratage. 😉
Vous pouvez également définir par programmation java.rmi.serveur.le code de la propriété:
pour une hypothétique
Hello
RMI service.Je pense que l'exception est en fait en sortant de rmiregistry. Cette partie de la trace de la pile est ce qui me fait penser de la sorte. Le stub pour rmiregistry est la réception de l'exception et de la passer en arrière en haut comme le résultat de la tentative de relier.
Essayez d'exécuter rmiregistry avec
-J-Djava.security.policy=all.policy
où le fichier de stratégie donne toutes les autorisations (au moins pour faire avancer les choses).Finalement, vous pouvez aussi vous souhaitez passer une HTTP base de code URL, juste de sorte que vous pouvez exécuter les clients sur une machine séparée de votre serveur.
J'ai une petite question...
Pourquoi a-t-il utiliser ce chemin: "file://C:/ProjX/serveur/serverProj/bin/usermanager"
je suppose qu'il est dans les fenêtres, et les chemins d'accès dans windows sont écrits C:\ProjX......
Je demande parce que j'ai quelques problèmes avec le RMI aussi, mais j'ai le fichier de stratégie dans ce mode:
Est mal?
Il fonctionne très bien lorsque je fixe la variable CLASSPATH avant de commencer le rmi registre. Je pense que l'idée est que le RMI Registre permettra de charger votre télécommande talons et il devrait a accès. C'était facile en mettant mes cours sur le chemin de la classe avant d'exécuter le registre. Donc, il n'est pas lié à une quelconque autre raison, comme le JDK 7 ou file:/protocole.