Domanda

Ehi sto ottenendo un AccessControlException: access denied quando si tenta di avviare un'applicazione RMI che sto scrivendo, non riesco a capire il motivo per cui ho questa eccezione se apro sulla porta predefinita 1099, oppure su un'altra porta dinamica, il mio file di criteri attualmente concede tutto (cambia quando applicazione è terminata).

Sono bloccato da dove sta andando male, tutto l'aiuto sarebbe di grande utilità

Il mio codice

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

}

L'Analisi dello stack

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

Valido Port

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)

La mia politica di file

grant {
// Allow everything for now
permission java.security.AllPermission;
};
È stato utile?

Soluzione 2

Fondamentalmente, io sono stupido, ho pensato che, poiché Java non si lamentava che era trovare il file .policy AOK, scopre che non si muoveva una nuova copia di the.policy file nella directory di lavoro risolve tutti :-D

Altri suggerimenti

Sono stato bloccato in questo tutto il giorno (dopo capire che ho dovuto iniziare la rmiregistry dalla linea di comando), cercando di fare questo lavoro a livello locale con Eclipse, e alla fine risolto. Alcune indicazioni per salvare gli altri questo destino crudele:

1 - assegnare il file dei criteri in modo corretto, sia con una bandiera di comando:

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

o mettendo questo direttamente nel codice:

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

Si può anche mettere nella stessa cartella del radice del progetto), per ridurre l'URI per

file:./<filename>.policy

(utilizzare un parente invece di URI assoluto - Io in realtà non ho capito questo fino ad oggi)

.

2 - assicurarsi che il formato del file di criteri è corretta, per esempio:.

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

Questo dovrebbe fare riferimento alla cartella in cui si trova il binario! Una spiegazione approfondita del formato del file politica è href="http://docs.oracle.com/javase/7/docs/technotes/guides/security/PolicyFiles.html" qui .

Questo è tutto, mi piacerebbe anche raccomandare questo tutorial , ho trovato molto utile per ottenere sulla strada giusta.

Ho trovato la maggior parte delle risposte su questo argomento vaghe e inutili, e ha trascorso diverse ore di debug questo. Più che probabile, il vostro errore è perché il file di criteri è o non correttamente formattato o non si sta impostando correttamente come argomento della riga di comando.

Se stai ricevendo un java.security.AccessControlException: access denied ("java.net.SocketPermission" "127.0.0.1:1099" "connect,resolve")

  1. Crea un file di criteri di sicurezza con tutte le autorizzazioni, solo per verificare il lavoro svolto

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

  1. Utilizzare questo file di sicurezza sia per il client e il server, solo per farlo funzionare.

  2. Assicurarsi che non si dispone di eventuali errori di battitura. Ho passato ore a cercare di capire il motivo per cui non funzionava, e ho avuto digitato -Djava.rmi.security.policy invece di -Djava.security.policy = ...

Per quelli di noi che vogliono solo ottenere il tutorial RMI da Oracle installato e funzionante, questa politica di sicurezza sarà più che sufficiente per questo esempio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top