2015-04-24 3 views
0

Я хочу загрузить политику SecurityManager из файла client.policy. Я читал, что могу сделать это, указав -Djava.security.policy = client.policy. Но я не хочу указывать это в командной строке. Я пытаюсь указать его в файле свойств. На самом деле мое исключение кода. Как я могу прочитать политику без аргументов командной строки?RMISecurityManager - загрузить client.policy

Вот фрагменты моего кода:

prop.load(ClassLoader.getSystemResourceAsStream("config.properties")); 
     prop.putAll(System.getProperties());//add Properties from command line 

     RMISecurityManager rmi = new RMISecurityManager(); 
     if (System.getSecurityManager() == null) { 
      System.setSecurityManager(rmi); 
     } 

     //Connect to server by RMIRegistry 
     rmiRegistryAddress = prop.getProperty("rmi.registryaddress"); 
     logger.info("Klient: serwer szukany pod adresem: "+rmiRegistryAddress); 
     ISerwer serwer = (ISerwer) Naming.lookup(rmiRegistryAddress + "/" + SERWER_REMOTE_OBJECT_NAME); 

config.properties:

rmi.registryaddress = rmi://192.168.2.3:1099 
    #java.rmi.server.codebase=http://... 
    java.security.policy=client.policy 

client.policy:

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

И исключение:

java.security.AccessControlException: доступ запрещен ("java.net.SocketPermission" "192.168.2.3:1099" "подключения, рассосется") в java.security.AccessControlContext.checkPermission (AccessControlContext.java:372) в java.security.AccessController.checkPermission (AccessController.java:559) на java.lang.SecurityManager.checkPermission (SecurityManager.java:549) на java.lang.SecurityManager.checkConnect (SecurityManager.java:1051) на java.net.Socket.connect (Socket.java:574) на java.net.Socket.connect (Socket.java:528) на java.net.Socket. (Socket.java:425) на java.net .Socket (Socket.java:208) по адресу sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket (RMIDirectSocketFactory.java:40) на sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket (RMIMasterSocketFactory.java:147) в sun.rmi.transport.tcp. TCPEndpoint.newSocket (TCPEndpoint.java:613) на sun.rmi.transport.tcp.TCPChannel.createConnection (TCPChannel.java:216) на sun.rmi.transport.tcp.TCPChannel.newConnection (TCPChannel.java: 202) на sun.rmi.server.UnicastRef.newCall (UnicastRef.java:341) на sun.rmi.registry.RegistryImpl_Stub.lookup (Неизвестный источник) на java.rmi.Naming.lookup (Naming.java:101) по адресу sr.warcaby.klient.Klient.run (Klient.java:88) по адресу sr.warcaby.klient.Klient.main (Klient.java:73)

Похоже, что файл client.policy как-то не читается.

Второй вопрос: как предоставить все разрешения локальному коду? Этот путь («файл: src /») не работает. Я хочу установить относительный путь.

Редактировать:

Я внесла некоторые изменения. Теперь программа работает, но не так, как я хочу. Он дает все права на код с удаленной кодовой базы, но я хочу предоставить только некоторые разрешения на удаленный код.

Изменения:

System.setProperties(prop);

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

java.security.policy=src/main/resources/client.policy java.rmi.server.codebase=http://...somehttpaddress.../warcabycodebase-jar-with-dependencies.jar

+0

У меня есть еще одна проблема. Политика клиента работает, когда я запускаю классы из Eclipse. Но когда я создаю jar, который содержит client.policy, и когда я запускаю эту банку, client.policy не работает. – Adalbertus

ответ

0

Там нет ничего, что на самом деле устанавливает содержимое файла .properties в свойствах системы.

NB Вам необходимо установить java.security.policyдо, который устанавливается администратором безопасности.

И не нужно вообще устанавливать диспетчер безопасности, если вы не используете функцию базы данных RMI, с классами, предоставляемыми сервером.

+0

Спасибо. Я добавил ваши изменения. См. Отредактированный вопрос. – Adalbertus

+0

У вас есть классы кодовой базы, также доступные локально? Если это так, они не будут загружены из базы кода и будут иметь соответствующие разрешения. – EJP