Я хочу загрузить политику 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
У меня есть еще одна проблема. Политика клиента работает, когда я запускаю классы из Eclipse. Но когда я создаю jar, который содержит client.policy, и когда я запускаю эту банку, client.policy не работает. – Adalbertus