Estamos utilizando GraalVM para algunos requisitos de secuencias de comandos en nuestro producto. La versión de GraalVM es 21.2.0 Estamos usando JavaScript y Groovy. Queremos prohibir el uso de algunos métodos en ciertas clases en scripts. Ejemplo :
mytest.js
var testService=Java.type('mypackage.TestService'); new testService().forbiddenJavaMethod(); // this should not be calledTestService.java
package mypackage; public class TestService{ public void forbiddenJavaMethod(){ // business logic } }¿Hay alguna manera de lograr esto en Graal? No pude encontrar una manera de hacer el filtrado de "método". ¿Algún otro enfoque para resolver esto?
Puede configurar el acceso al host al configurar el contexto. A saber
public Context.Builder allowHostAccess(HostAccess config)Dónde se puede acceder al host
HostAccess.EXPLICIT - Java host methods or fields, must be public and be annotated with @Export to make them accessible to the guest language.https://www.graalvm.org/truffle/javadoc/org/graalvm/polyglot/HostAccess.html
O puede entrar en un control mucho más detallado usando HostAccess.Builder
https://www.graalvm.org/truffle/javadoc/org/graalvm/polyglot/HostAccess.Builder.html
Si no puede usar HostAccess.EXPLICIT por algún motivo (por ejemplo, desea mantener el acceso a java.util, etc.), puede crear clases contenedoras personalizadas que solo expongan los métodos relevantes. Con allowHostClassLookup() puede limitar qué clases están expuestas en el motor.
public class Example { public static void main(String[] args) { TestService service = new TestService(); Context.Builder builder = Context.newBuilder("js") .allowHostAccess(HostAccess.ALL) .allowHostClassLookup(path -> path.endsWith("TestServiceScriptable")); GraalJSScriptEngine engine = GraalJSScriptEngine.create(null, builder); engine.put("service", TestServiceScriptable.newInstance(service)); } } public class TestService { public void forbiddenJavaMethod() { System.out.println("forbidden!"); } public void allowedMethod() { System.out.println("allowed"); } } public class TestServiceScriptable { private final TestService service; private TestServiceScriptable(TestService service) { this.service = service; } public static TestServiceScriptable newInstance(TestService service) { return new TestServiceScriptable(service); } public void allowedMethod() { service.allowedMethod(); } }Después:
// Should work service.allowedMethod(); // Shouldn't work service.forbiddenMethod();