Ich möchte einige nicht verifizierte Skripte ausführen (die in einer noch zu bestimmenden Sprache geschrieben sind, aber auf Java basieren müssen, also sind JRuby, Groovy, Jython, BeanShell usw. allesamt Kandidaten). Ich möchte, dass diese Skripte einige Dinge tun können und andere Dinge nicht tun dürfen.
Normalerweise würde ich einfach den SecurityManager von Java verwenden und damit fertig sein. Das ist ziemlich einfach und ermöglicht es mir, den Datei- und Netzwerkzugriff einzuschränken, die JVM herunterzufahren, usw. Und das wird gut funktionieren für die High-Level-Sachen, die ich abblocken will.
Aber es gibt einige Dinge, die ich zulassen möchte, aber nur über meine benutzerdefinierte API/Bibliothek, die ich bereitgestellt habe. Zum Beispiel möchte ich keinen direkten Netzwerkzugriff erlauben, um eine URLConnection zu yahoo.com zu öffnen, aber ich bin OK, wenn es mit MyURLConnection getan wird. Das heißt, es gibt eine Reihe von Methoden/Klassen, die ich zulassen möchte, und alles andere soll tabu sein.
Ich glaube nicht, dass diese Art von Sicherheit mit dem Standard-Java-Sicherheitsmodell möglich ist, aber vielleicht ist es möglich. Ich habe keine besonderen Anforderungen an die Leistung oder Flexibilität der Skriptsprache selbst (die Skripte werden einfache prozedurale Aufrufe meiner API mit einfachen Schleifen/Verzweigungen sein). Selbst ein "großer" Overhead, der bei jedem Reflection-Aufruf eine Sicherheitsüberprüfung durchführt, ist für mich also kein Problem.
Vorschläge?