java rmi accesscontrolexception

Java RMI AccessControlException: acceso denegado



(3)

Hola, AccessControlException: access denied una AccessControlException: access denied al intentar iniciar una aplicación RMI que estoy escribiendo. No puedo entender por qué recibo esta excepción si la abro en el puerto predeterminado 1099 o en otro puerto dinámico. mi archivo de política actualmente lo otorga todo (cambiará cuando la aplicación se complete).

Estoy atascado en cuanto a dónde va mal, cualquier ayuda sería de gran utilidad

Mi código

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? } }

}

El seguimiento de la pila

vega3 [ia32.linux] 23% java -Djava.security.policy=wideopen.policy -jar "BookStore-CreditCardServer.jar 65000"

Puerto valido

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)

Mi archivo de política

grant { // Allow everything for now permission java.security.AllPermission; };


Básicamente, soy estúpido, asumí que debido a que Java no se quejaba de haber encontrado el archivo .policy AOK, resulta que no estaba moviendo una nueva copia del archivo .policy al directorio de trabajo resuelve todo :-D


Encontré que la mayoría de las respuestas sobre este tema eran vagas e inútiles, y pasé varias horas depurando esto. Lo más probable es que su error se deba a que el archivo de políticas tiene un formato incorrecto o no lo está configurando correctamente como un argumento de línea de comandos.

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

  1. Cree un archivo de política de seguridad con todos los permisos, solo para probarlo

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

  1. Use este archivo de seguridad tanto para el cliente como para el servidor, solo para ponerlo en funcionamiento.

  2. Asegúrate de no tener errores tipográficos. Pasé horas tratando de averiguar por qué no funcionaba, y había escrito -Djava.rmi.security.policy en lugar de -Djava.security.policy = ...

Para aquellos de nosotros que solo queremos que el tutorial de RMI de Oracle esté en funcionamiento, esta política de seguridad será más que suficiente para ese ejemplo.


He estado atascado en esto todo el día (después de descubrir que tuve que iniciar el rmiregistry desde la línea de comandos), tratando de hacer que esto funcionara localmente con Eclipse, y finalmente lo resolví. Algunos consejos para salvar a otros este cruel destino:

1: asigne el archivo de políticas correctamente, ya sea con una marca de línea de comando:

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

o poniendo esto directamente en su código:

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

También puede ponerlo en la misma carpeta que la raíz de su proyecto), para reducir el URI a

file:./<filename>.policy

(utilice un URI relativo en lugar de un URI absoluto; en realidad no lo entendí hasta hoy).

2: asegúrese de que el formato del archivo de política sea correcto, por ejemplo:

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

¡Esto debería referirse a la carpeta donde se encuentra su binario! Una explicación detallada del formato del archivo de política está here .

Eso es todo, también recomendaría este tutorial , me resultó muy útil para seguir el camino correcto.