You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin实现RMI遇权限拒绝问题:Server.policy未生效

解决Kotlin RMI中server.policy未生效的AccessControlException问题

我之前折腾RMI权限配置的时候也踩过这个坑,给你几个实用的排查和解决步骤:

  • 先确认server.policy的权限规则是否正确
    你需要确保policy文件里给足了必要的Socket权限,不仅是127.0.0.1:1099,还要考虑RMI通信可能用到的随机端口。示例配置如下:

    grant {
        // 允许连接RMI注册中心端口
        permission java.net.SocketPermission "127.0.0.1:1099", "connect,resolve";
        permission java.net.SocketPermission "localhost:1099", "connect,resolve";
        // 允许RMI通信用到的1024以上的随机端口(接受和连接)
        permission java.net.SocketPermission "*:1024-", "accept,connect,resolve";
    };
    
  • 启动时必须显式指定policy文件
    JVM不会自动加载server.policy,你需要在启动应用时通过VM参数指定。如果是用Gradle运行Kotlin程序,在VM参数里添加:

    -Djava.security.policy=server.policy
    

    如果是打包成Jar运行,命令应该是:

    java -Djava.security.policy=server.policy -jar your-rmi-server.jar
    

    注意:如果server.policy不在当前工作目录,要写完整的绝对路径,比如/home/you/projects/rmi/server.policy。

  • 确保安全管理器已启用
    RMI的权限控制依赖JVM安全管理器,启动时需要加上这个参数:

    -Djava.security.manager
    

    或者你也可以在Kotlin代码里手动设置(推荐用启动参数更灵活):

    fun main() {
        System.setSecurityManager(SecurityManager())
        // 后续RMI注册和服务启动代码
    }
    

    提示:Java 17及以上版本中SecurityManager已被废弃,如果你的项目用的是新版本JDK,可能需要调整为使用模块化权限或者禁用安全管理器(但生产环境不建议禁用)。

  • 避免系统默认policy覆盖你的配置
    如果上面的步骤都试过还是不行,可能是系统默认的java.policy文件限制了权限。这时候可以用两个等号指定policy,强制JVM只使用你的配置:

    -Djava.security.policy==server.policy
    

另外要提醒的是,Kotlin和Java的RMI底层都是依赖JVM的安全机制,所以配置逻辑完全一致,不用因为用了Kotlin做特殊处理。

内容的提问来源于stack exchange,提问作者Larrikin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:15:56