2010-03-11 36 views
16

Oye me estoy poniendo AccessControlException: access denied al intentar iniciar una aplicación RMI que estoy escribiendo, no puedo entender por qué obtengo esta excepción si la abro en el puerto predeterminado 1099, o en otro puerto dinámico, mi archivo de políticas actualmente otorga todo (cambiará cuando la aplicación finalice).Java RMI AccessControlException: acceso denegado

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" 

Válido Puerto

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íticas

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

Puede hacer un nmap en su máquina para asegurarse de que algo no esté utilizando ese puerto (por ejemplo, ejecutó este programa antes y no murió limpiamente). – Dave

Respuesta

3

Básicamente, soy estúpido, por supuesto que no porque se quejaba de Java que fue encontrar el archivo de AOK .policy , resulta que no estaba moviendo una nueva copia del archivo.policy en el directorio de trabajo lo resuelve todo :-D

25

Me he quedado atrapado en esto todo el día (después de descubrir que tenía que iniciar el rmiregistry desde la línea de comandos), tratando de hacer que esto funcionara localmente con Eclipse, y finalmente lo resolví. Algunas sugerencias para salvar a otros de este cruel destino:

1 - asignar el archivo de políticas correctamente, ya sea con una bandera de comandos:

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

o poniendo esto directamente en el código:

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

también puede ponerlo en la misma carpeta que la raíz del proyecto), para reducir el URI para

file:./<filename>.policy 

(use un URI relativo en lugar de absoluto - de hecho no entendí esto hasta hoy).

2 - asegúrese de que el formato del archivo de política es correcta, por ejemplo .:

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

Esto debería hacer referencia a la carpeta donde se encuentra el binario! Una explicación detallada del formato del archivo de política es here.

Eso es todo, yo también recomendaría this tutorial, me pareció muy útil seguir el camino correcto.

+0

+1 Gracias por esta respuesta expansiva a esta vieja pero todavía muy válida pregunta Nauta & wecome. –

+0

La explicación del formato del enlace del archivo de política está desactualizada. – BlueDolphin

+1

¿Cómo obtengo la ruta correcta para el archivo 'security.policy'? – CodyBugstein

-1

Encontré la mayoría de las respuestas sobre este tema 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ítica tiene un formato incorrecto o no lo está configurando correctamente como un argumento de línea de comando.

Si usted está recibiendo un java.security.AccessControlException: access denied ("java.net.SocketPermission" "127.0.0.1:1099" "connect,resolve")

  1. Crear un archivo de política de seguridad con todos los permisos, sólo para probarlo

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

  1. Utilice este archivo de seguridad tanto para el cliente como para el servidor, solo para ejecutarlo.

  2. Asegúrese de no tener ningún error tipográfico. Me pasé horas tratando de averiguar por qué no estaba funcionando, y que 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 funcione y se ejecute, esta política de seguridad será más que suficiente para ese ejemplo.

+0

Su respuesta es básicamente idéntica a [ésta] (https://stackoverflow.com/a/10157900/207421) que fue publicada hace seis años, y que no es ni vaga ni inútil. O si no, tuyo también. – EJP

+0

Después de pasar horas depurando esto, puedo asegurarle que debe haber más respuestas para este problema. Encontré esta línea particularmente ampliamente complicada con el problema "¡Esto debería referirse a la carpeta donde se encuentra tu binario!" –