免责声明:旧版本的问题令SecurityManager
和AccessController
混淆不清。但现在我知道我犯了一个错误,这个问题很精致。
茎很直接;我正在寻找一种限制脚本在某些ScriptEngine中可以执行的操作的方法。
我读过一些类似的问题,包括新旧问题。 NashornScriptEngine
使用名为ClassFilter
的类似乎有一个解决方案。但我正在寻找一种通用的方式,无论他们的脚本引擎实现如何。有些人认为Java的AccessController
就是这样。所以我开始阅读并使用AccessController
,到目前为止,我已经得到了这个:
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
Permissions perms = new Permissions();
ProtectionDomain domain = new ProtectionDomain(new CodeSource( null, (Certificate[]) null ), perms);
AccessControlContext acc = new AccessControlContext(new ProtectionDomain[] { domain });
AccessController.doPrivileged(new PrivilegedAction() {
@Override
public Object run() {
try {
//I want the following line to throw a SecurityException
return engine.eval("var System = Java.type('java.lang.System'); print(System.getProperty('java.home'));");
}
catch (ScriptException e) {
e.printStackTrace();
}
return null;
}},
acc
);
//At the same time I want the following line to work
System.out.println(System.getProperty("java.home"));
脚本运行就像没有涉及AccessController一样!
所以我的问题是;是AccessController
这样做的方法?如果是,那我该怎么做呢?
答案 0 :(得分:0)
所以我自己设法解决了这个问题。在阅读了一点之后,我发现AccessController
如果未激活SecurityManager
则无效。以下是您如何激活它:
添加两个VM选项:-Djava.security.manager
-Djava.security.policy=security.policy
在项目的根文件夹中创建一个security.policy
文件,其中包含以下内容:
grant {
permission java.security.AllPermission;
};
这将激活项目的SecurityManager
并授予其所有权限。换句话说,它只会激活SecurityManager
,但您的代码将像以前一样工作。现在,您可以使用上面给出的代码控制应用程序访问控制的各个部分。