我想从文件SecurityManager加载client.policy策略。我读到我可以指定-Djava.security.policy=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.policyclient.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) at java.security.AccessController.checkPermission(AccessController.java:559) at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) at java.lang.SecurityManager.checkConnect(SecurityManager.java:1051) at java.net.Socket.connect(Socket.java:574) at java.net.Socket.connect(Socket.java:528) at java.net.Socket.(套接字)( sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40) at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:147) 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 )sun.rmi.server.UnicastRef.newCall(UnicastRef.java:341) at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source java.rmi.Naming.lookup(Naming.java:101) at sr.warcaby.klient.Klient.run(Klient.java:88) at sr.warcaby.klient.Klient.main(Klient.java:73)
看来client.policy文件似乎没有读取。
第二个问题:如何将所有权限授予本地代码?此路径("file: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
发布于 2015-04-24 10:08:42
这里没有实际将.properties文件的内容设置为系统属性的内容。
在安装安全管理器之前,需要设置java.security.policy。
而且,您根本不需要安装安全管理器,除非您使用的是RMI代码基特性,并且由服务器提供类。
https://stackoverflow.com/questions/29843441
复制相似问题