Java RMI AccessControlexception : 액세스 거부
-
19-09-2019 - |
문제
이봐, 난 AccessControlException: access denied
내가 쓰고있는 RMI 앱을 시작하려고 할 때, 기본 포트 1099 또는 다른 동적 포트에서 열면이 예외를 얻는 이유를 해결할 수 없습니다. 내 정책 파일은 현재 모든 것을 부여합니다 (언제 변경 될 때 변경됩니다. 앱이 완료되었습니다).
나는 그것이 어디에서 잘못 될지에 갇혀있다. 어떤 도움이든 큰 도움이 될 것이다.
내 코드
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?
}
}
}
스택 추적
vega3 [ia32.linux] 23% java -Djava.security.policy=wideopen.policy -jar "BookStore-CreditCardServer.jar 65000"
유효한 포트
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)
내 정책 파일
grant {
// Allow everything for now
permission java.security.AllPermission;
};
해결책 2
기본적으로, 나는 바보입니다. Java가 .policy 파일 AOK를 찾는 것으로 불평하지 않았기 때문에, 새로운 파일의 사본을 이동하지 않았다는 것이 밝혀졌습니다.
다른 팁
나는 하루 종일 멈췄다 (명령 라인에서 rmiregistry를 시작해야한다는 것을 알게 된 후),이 일을 일식으로 현지에서 만들려고 노력하고 마침내 해결했다. 이 잔인한 운명을 다른 사람들을 구하기위한 몇 가지 조언 :
1- 명령 선 플래그로 정책 파일을 올바르게 할당합니다.
java -Djava.security.policy=/home/.../<filename>.policy ...
또는 이것을 코드에 직접 넣음으로써 :
System.setProperty("java.security.policy","file:///home/.../<filename>.policy");
URI를 줄이기 위해 프로젝트 루트와 동일한 폴더에 넣을 수도 있습니다.
file:./<filename>.policy
(절대 URI 대신 상대를 사용하십시오 - 나는 실제로 오늘까지 이것을 이해하지 못했습니다).
2- 정책 파일의 형식이 올바른지 확인하십시오.
grant codeBase "file:<path>/bin/-" {
permission java.security.AllPermission;
};
이것은 바이너리가있는 폴더를 참조해야합니다! 정책 파일의 형식에 대한 철저한 설명은 다음과 같습니다. 여기.
그것에 관한 것입니다, 나는 또한 추천합니다 이 튜토리얼, 나는 올바른 길을 가면 매우 도움이된다는 것을 알았습니다.
나는이 주제에 대한 대부분의 답변을 모호하고 도움이되지 않았으며, 이것을 디버깅하는 데 몇 시간을 보냈습니다. 정책 파일이 잘못 형식화되거나 명령 줄 인수로 올바르게 설정하지 않기 때문에 오류가 발생할 가능성이 높습니다.
당신이 받고 있다면 java.security.AccessControlException: access denied ("java.net.SocketPermission" "127.0.0.1:1099" "connect,resolve")
- 모든 권한이있는 보안 정책 파일을 작성하여 테스트하기 만하면
grant codeBase "file:/-" {
permission java.security.AllPermission;
};
클라이언트와 서버 모두 에이 보안 파일을 사용하여 실행하기 만하면됩니다.
오타가 없는지 확인하십시오. 왜 작동하지 않는지 알아 내려고 시간을 보냈고 -djava.rmi.security.policy를 입력했습니다. -djava.security.policy =...
Oracle Up and Running에서 RMI 튜토리얼을 받고 싶어하는 사람들에게는이 보안 정책이 그 예를 들어 충분할 것입니다.