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
相关产品推荐
相关产品推荐

