Java RMI AccessControlException: acesso negado
-
19-09-2019 - |
Pergunta
Ei, eu estou ficando um AccessControlException: access denied
ao tentar iniciar um aplicativo RMI eu estou escrevendo, eu não posso trabalhar para fora porque eu recebo esta exceção se eu abri-lo na porta padrão 1099, ou em outra porta dinâmico, meu arquivo de política actualmente concede tudo (vai mudar quando o aplicativo está terminada).
Eu estou preso como para onde ele está indo mal, qualquer ajuda seria de grande utilidade
Meu 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?
}
}
}
O rastreamento de pilha
vega3 [ia32.linux] 23% java -Djava.security.policy=wideopen.policy -jar "BookStore-CreditCardServer.jar 65000"
Válido Porto
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)
Arquivo Meu Política
grant {
// Allow everything for now
permission java.security.AllPermission;
};
Solução 2
Basicamente, eu sou estúpido, eu supor que porque Java não estava reclamando que foi encontrar o AOK arquivo .policy, Acontece que ele não estava se movendo uma nova cópia do arquivo the.policy nas resolve diretório de trabalho todos :-D
Outras dicas
Eu estive preso neste durante todo o dia (depois de descobrir que eu tinha para iniciar o rmiregistry a partir da linha de comando), tentando fazer este trabalho localmente com Eclipse, e, finalmente, resolvido. Alguns ponteiros para salvar os outros esse destino cruel:
1 - atribuir o arquivo de política corretamente, seja com uma bandeira de comando:
java -Djava.security.policy=/home/.../<filename>.policy ...
ou colocando isso diretamente em seu código:
System.setProperty("java.security.policy","file:///home/.../<filename>.policy");
Você também pode colocá-lo na mesma pasta como seu raiz do projeto), para reduzir o URI para
file:./<filename>.policy
(use um parente em vez de absoluta URI - Na verdade, eu não entendia isso até hoje)
. .2 - Certifique-se o formato do arquivo de política é correta, por exemplo:
grant codeBase "file:<path>/bin/-" {
permission java.security.AllPermission;
};
Esta deve consultar a pasta onde o binário está localizado! Uma explicação completa sobre o formato do arquivo de política é aqui .
Isso é sobre ele, eu também recomendo este tutorial , Eu achei muito útil para obter no caminho certo.
Eu encontrei a maioria das respostas sobre este tópico vago e inútil, e passou várias horas de depuração isso. Mais do que provável, seu erro é porque o arquivo de política ou é formatado incorretamente ou você não está definindo-o corretamente como um argumento de linha de comando.
Se você está recebendo um java.security.AccessControlException: access denied ("java.net.SocketPermission" "127.0.0.1:1099" "connect,resolve")
- Crie um arquivo de política de segurança com todas as permissões, apenas para testá-lo
grant codeBase "file:/-" {
permission java.security.AllPermission;
};
-
Use este arquivo de segurança, tanto para o cliente eo servidor, só para fazê-lo funcionar.
-
Certifique-se de que você não tem quaisquer erros de digitação. Passei horas tentando descobrir por que ele não estava trabalhando, e eu tinha digitado -Djava.rmi.security.policy em vez de -Djava.security.policy = ...
Para aqueles de nós que querem apenas para obter o tutorial RMI da Oracle instalado e funcionando, esta política de segurança será mais do que suficiente para que o exemplo.