gpt4 book ai didi

Java RMI 教程 - AccessControlException : access denied (java. io.FilePermission

转载 作者:太空狗 更新时间:2023-10-29 22:55:33 25 4
gpt4 key购买 nike

昨天我尝试开始使用 Java RMI。我找到了这个 sun 教程 (http://java.sun.com/docs/books/tutorial/rmi/index.html) 并从服务器实现开始。但是每次我启动 pogram(rmiregistry 正在运行)时,我都会得到一个带有以下 StackTrace 的 AccessControlException:

LoginImpl exception:
java.security.AccessControlException: access denied (java.io.FilePermission \\\C\ProjX\server\serverProj\bin\usermanager read)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:264)
at java.security.AccessController.checkPermission(AccessController.java:427)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.SecurityManager.checkRead(SecurityManager.java:871)
at java.io.File.exists(File.java:700)
at sun.net.www.protocol.file.Handler.openConnection(Handler.java:80)
at sun.net.www.protocol.file.Handler.openConnection(Handler.java:55)
at java.net.URL.openConnection(URL.java:943)
at sun.rmi.server.LoaderHandler.addPermissionsForURLs(LoaderHandler.java:1020)
at sun.rmi.server.LoaderHandler.access$300(LoaderHandler.java:52)
at sun.rmi.server.LoaderHandler$Loader.<init>(LoaderHandler.java:1108)
at sun.rmi.server.LoaderHandler$Loader.<init>(LoaderHandler.java:1089)
at sun.rmi.server.LoaderHandler$1.run(LoaderHandler.java:861)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.server.LoaderHandler.lookupLoader(LoaderHandler.java:858)
at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:541)
at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:628)
at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:294)
at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:238)
at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1494)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1457)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1693)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)
at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:375)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:240)
at sun.rmi.transport.Transport$1.run(Transport.java:153)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:460)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:701)
at java.lang.Thread.run(Thread.java:595)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source)
at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
at startserver.StartServer.main(StartServer.java:22)

我的 server.policy 文件如下所示:

grant {
permission java.security.AllPermission;
};

不过这个我也试过:

grant {
permission java.security.AllPermission;
permission java.io.FilePermission "file://C:/ProjX/server/serverProj/bin/usermanager", "read";
};

...还有这个(和其他几个 :-():

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

但在每种情况下,结果都是一样的。是的,策略文件在路径中(当我将错误的语句写入策略文件时,我看到一个解析异常)。我试了其他几个“/”和“”星座都没有效果。

我使用 Eclipse,我的 VM 参数是这样的:

-cp C:\ProjX\server\serverProj\bin\usermanager\
-Djava.rmi.server.codebase=file://C:/ProjX/server/serverProj/bin/usermanager/
-Djava.rmi.server.hostname=XYZ (anonymized)
-Djava.security.policy=server.policy

编译后的 Remote-Interface 和接口(interface)实现类 (LoginImpl) 类位于此路径:“C:/ProjX/server/serverProj/bin/usermanager/”。我实例化 stub 并将其重新绑定(bind)到注册表的主要方法位于另一个包中,如下所示:

public static void main(String[] args) {
if (System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManager());
}
try {
String name = "Login";
Login login = new LoginImpl();
Login stub = (Login) UnicastRemoteObject.exportObject(login, 0);
Registry registry = LocateRegistry.getRegistry();
registry.rebind(name, stub);
System.out.println("LoginImpl bound");
} catch (Exception e) {
System.err.println("LoginImpl exception:");
e.printStackTrace();
}
}

有人对我有什么建议吗?


所以问题是一样的(java.rmi.UnmarshalException 表明更改代码库不是我的 AccessControlException 的解决方案)。不:我不想购买插件“GB”。

最佳答案

将所有权限授予所有代码真的很糟糕。任何 RMI 客户端都可以作为登录用户执行它想要的操作。通常,尝试尽可能合理地限制权限,尤其是当您不知道代码的来源时。

回到问题...

-Djava.rmi.server.codebase=file://C:/ProjX/server/serverProj/bin/usermanager/

应该是 "file:///C:/...""file:/C:/..."。想想http。 “http://C:/...” 指的是名为C 的主机。请注意,异常消息去掉了冒号,因为那只是端口号的语法。

即使您授予对所有代码的权限,您仍会遇到安全异常的原因是 RMI 将权限限制为给定涉及的 URL(使用 AccessController doPrivileged 两个参数形式)的适当权限。

关于Java RMI 教程 - AccessControlException : access denied (java. io.FilePermission,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/179799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com