Pat*_*ody 11 java security groovy jython jruby
我正在寻找运行一些未经验证的脚本(用一种尚未确定的语言编写,但需要基于Java,因此JRuby,Groovy,Jython,BeanShell等都是候选者).我希望这些脚本能够做一些事情并限制做其他事情.
通常,我只是使用Java的SecurityManager并完成它.这非常简单,让我限制文件和网络访问,关闭JVM的能力等等.这对我想要阻止的高级别东西很有效.
但是我想要允许一些东西,但只能通过我提供的自定义API /库.例如,我不想允许直接网络访问打开到yahoo.com的URLConnection,但如果使用MyURLConnection完成,我没关系.那就是 - 我想要允许的一组方法/类,然后我想要的其他一切不受限制.
我不相信这种类型的安全性可以使用标准的Java安全模型来完成,但也许它可以.我对脚本语言本身的性能或灵活性没有特定要求(脚本将通过基本循环/分支对我的API进行简单的过程调用).所以即使是一个"大"的开销来检查每次反射调用的安全检查也没问题.
建议?
免责声明:我不是 Java 安全 API 方面的专家,因此可能有更好的方法来做到这一点。
我在Alfresco工作,这是一种基于 Java 的开源企业 CMS,我们实现了与您所描述的类似的内容。我们希望允许脚本编写,但仅向脚本引擎公开 Java API 的子集。
我们选择 Rhino Engine 来编写 JavaScript 脚本。它允许您控制向 JavaScript 公开哪些 API,从而允许我们选择哪些类可用,哪些类不可用。根据我们的工程师的说法,开销约为 10%——还不错。
除此之外,这可能也与您相关,在 Java 方面,我们使用 Acegi(现在的 Spring Security),并使用 AOP 对某个用户可以调用哪些方法进行基于角色的控制。这对于授权来说非常有效。因此,实际上,通过 JavaScript 访问我们的应用程序的用户首先拥有可用的受限 API,然后可以根据授权进一步限制该 API。因此,您可以使用 AOP 技术来进一步限制可以调用哪些方法,从而允许在其他脚本语言中公开这一点,例如 Groovy 等。我们也在添加这些方法,相信我们的底层 Java API 保护用户免受未经授权的访问。