문제

이봐, 난 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")

  1. 모든 권한이있는 보안 정책 파일을 작성하여 테스트하기 만하면

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

  1. 클라이언트와 서버 모두 에이 보안 파일을 사용하여 실행하기 만하면됩니다.

  2. 오타가 없는지 확인하십시오. 왜 작동하지 않는지 알아 내려고 시간을 보냈고 -djava.rmi.security.policy를 입력했습니다. -djava.security.policy =...

Oracle Up and Running에서 RMI 튜토리얼을 받고 싶어하는 사람들에게는이 보안 정책이 그 예를 들어 충분할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top