【问题标题】:Java SocketPermission policy questionJava SocketPermission 政策问题
【发布时间】:2011-05-08 21:32:18
【问题描述】:

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

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 权限,我可以让它工作。但我不知道这是否违反了限制。

【问题讨论】:

    标签: java policy securitymanager


    【解决方案1】:

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

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

    客户端不监听传入连接,不需要“监听”和“接受”权限。在服务器上,只要服务器不进行传出 tcp 连接,您就可以放弃“连接”权限。

    【讨论】:

    • 是的,这几乎就是我选择的路线。谢谢!我想那是没有办法了。
    • 临时端口范围也可以用 0 指定(例如,localhost:0)
    猜你喜欢
    • 2021-06-05
    • 2020-12-23
    • 2013-06-28
    • 2020-01-15
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    相关资源
    最近更新 更多