Java SocketPermission策略问题

时间:2010-11-12 05:40:19

标签: java policy securitymanager

我有一个尝试相互通信的客户端和服务器程序。在我的服务器的策略文件中,我指定了以下内容:

grant signedBy "vivin" {
  permission java.io.FilePermission "-", "read, write";
  permission java.net.SocketPermission "localhost:2220-2230", "accept, connect, listen, resolve", signedBy "vivin";
};

在我的客户的政策文件中,我有:

grant signedBy "vivin" {
  permission java.net.SocketPermission "localhost:2220-2230", "accept, connect, listen, resolve", signedBy "vivin";
};

我启动我的服务器并且它侦听端口2225.然后我启动我的客户端并尝试连接到正在侦听端口2225的服务器。不幸的是,我在服务器上收到此错误:

[java] Exception in thread "main" java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:45944 accept,resolve)
[java]  at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
[java]  at java.security.AccessController.checkPermission(AccessController.java:546)
[java]  at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
[java]  at java.lang.SecurityManager.checkAccept(SecurityManager.java:1157)
[java]  at java.net.ServerSocket.implAccept(ServerSocket.java:457)
[java]  at java.net.ServerSocket.accept(ServerSocket.java:421)

端口号不断变化;我假设它是客户端的端口号(服务器连接回客户端的位置?)。那是对的吗?对于此分配,端口号上指定了限制:

  

您的客户端和服务器应使用Java安全管理器,并且您的项目必须包含每个策略文件的策略文件,这些文件定义了运行它们所需的权限。允许您的服务器和客户端使用 2220-2230 范围内的端口在localhost上相互联系。

我如何遵守此限制?或者这仅适用于服务器侦听的端口?我认为如果我对大于2231的端口赋予acceptresolve权限,我可以使它工作。但我不知道是否违反了限制。

1 个答案:

答案 0 :(得分:5)

因为客户端随机选择了本地tcp端口(我猜)你应该给它适当的权限:

grant signedBy "vivin" {
  permission java.net.SocketPermission "localhost:1024-", "connect, resolve", signedBy "vivin";
};

客户端没有侦听传入连接,也不需要“listen”和“accept”的权限。在服务器上,只要服务器没有进行传出tcp连接,您就可以删除“connect”权限。