JRuby 的 Java 安全管理器

Posted

技术标签:

【中文标题】JRuby 的 Java 安全管理器【英文标题】:Java Security Manager for JRuby 【发布时间】:2010-06-03 11:05:17 【问题描述】:

当为 Jruby 脚本使用 Java 安全管理器时,是否可以单独授予特定脚本完全权限?

【问题讨论】:

【参考方案1】:

可能还有另一个答案:如果您想将单独的安全管理器应用于单独的脚本,那么您总是可以在单独的类加载器中启动单独的 JRuby 实例。他们不会分享任何东西,应该保持相当孤立。但尼克是对的,目前 JRuby 中没有内置任何东西来沙箱单个脚本,我们也没有任何计划这样做......

【讨论】:

是否可以获得至少一些关于当前正在运行的脚本的信息?例如,在 java 中使用 invokeFunction 我在 ruby​​ 脚本中调用一个函数,该函数又在另一个脚本中调用一个函数,依此类推.. 这是可能的,但需要一些挖掘;在解释代码时,除了 Java 堆栈上的 JRuby 解释器框架,您什么也看不到。您有几个选择: * 探索 org.jruby.runtime.ThreadContext 和 org.jruby.runtime.Frame,我们用来表示正在运行的 Ruby 线程和 Ruby 调用它正在解释的内部运行时结构。 * 强制所有内容在执行前编译,以便脚本名称显示在 Java 回溯中。【参考方案2】:

如果您的意思是对应用不同权限的不同脚本使用 same 安全管理器,那么答案是否定的,除非您自己编写安全管理器以某种方式感知脚本。无法在安全策略文件中指定脚本(就像对类一样)。我目前看到两个选项:

    编写一个自定义安全管理器,让其知道正在运行的脚本, 将 JRuby 脚本编译为 Java 类(使用 jrubyc --java)并将权限应用于不同的 Java 类。

关于 2 的帮助,我建议查看 Charlie 的 recent post。

【讨论】:

您能否详细说明第一个答案?是否可以让安全管理员了解正在运行的脚本? 您需要使用 JRuby 嵌入 API 来驱动您的脚本,以确保您可以从安全管理器中访问运行时结构。这里有一个小例子可以给你一个想法:gist.github.com/443025(请注意org.jruby.embed 包之外的 API 可能会发生变化。) 我正在使用 JSR223,它也可以这样工作!谢谢你的帮助! :)

以上是关于JRuby 的 Java 安全管理器的主要内容,如果未能解决你的问题,请参考以下文章

jruby-openssl 中已经初始化的常量

ruby JRuby的枚举器#to_enum将实例变量重新绑定到另一个上下文?

JRuby 1.7.26 发布,Java 的 Ruby 解释器

jruby tomcat bundler aws——“解决需求”堆栈太深

猪:java.lang.NoClassDefFoundError:org/jruby/embed/ScriptingContainer

JRuby PermGen 空间不足甚至在 ruby​​ 代码中使用 java 对象