Pregunta

Hola estoy un AccessControlException: access denied cuando se trata de poner en marcha una aplicación RMI que estoy escribiendo, no puedo entender por qué me sale esta excepción si lo abro en el puerto predeterminado 1099, o en otro puerto dinámico, mi archivo de política otorga actualmente todo (va a cambiar cuando se termine la aplicación).

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

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 Política del archivo

grant {
// Allow everything for now
permission java.security.AllPermission;
};
¿Fue útil?

Solución 2

Básicamente, estoy estúpido, por supuesto que ya no se quejaba de Java era encontrar el archivo .policy AOK, resulta que no se movía una nueva copia de the.policy archivo en el directorio de trabajo resuelve todos :-D

Otros consejos

Me han pegado en esto todo el día (después de averiguar que tenía que empezar el rmiregistry desde la línea de comandos), tratando de hacer este trabajo a nivel local con Eclipse, y finalmente resuelto. 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 la URI

file:./<filename>.policy

(utilizar un pariente en lugar de absoluta URI - Yo realmente no entiendo esto hasta hoy)

.

2 - asegurarse 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 href="http://docs.oracle.com/javase/7/docs/technotes/guides/security/PolicyFiles.html" aquí .

Eso es todo, también me gustaría recomendar este tutorial , me pareció muy útil para conseguir en el camino correcto.

Me pareció que la mayoría de las respuestas sobre este tema vagos e inútiles, y pasé varias horas de depuración esto. Lo más probable es que su error es debido a que el archivo de política es o bien un formato incorrecto o no se está configurando correctamente como un argumento de línea de comandos.

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

  1. Crea 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 y el servidor, sólo para ponerlo en marcha.

  2. Asegúrese de que usted no tiene ninguna errata. 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 sólo quieren conseguir el tutorial RMI de Oracle en funcionamiento, esta política de seguridad será más que suficiente para que el ejemplo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top