2013-04-08 8 views
9

Gibt es eine Möglichkeit, AccessController.doPrivileged mit einem neuen AccessControlContext zu Restricte Zugriff auf Klassen/Methoden zu verwenden? Ich hätte gerne eine Subroutine, die nicht vertrauenswürdigen Code aufrufen kann, ohne das Dateisystem zu berühren oder Sockets zu öffnen.Eine Methode in Java mit eingeschränkten Berechtigungen ausführen

Der spezielle Anwendungsfall besteht darin, Endbenutzern die Bereitstellung von Code- oder Skriptfragmenten (z. B. Javascript oder Groovy) zu ermöglichen, die mit eingeschränkten Berechtigungen ausgeführt werden können.

Ich suche nach einer normalen Sicherheitsrichtliniendatei, die auf den vom Benutzer bereitgestellten Code und nicht auf die gesamte JVM beschränkt ist.

+0

Stoß! Hast du mehr darüber herausgefunden? – Lii

Antwort

1

Ich nicht jetzt über AccessController Weg. Aber möglicherweise können Sie die Situation mit dem folgenden Schema steuern. Sie müssen mehrere Klassenlader haben: zuerst lädt Klassen wie sie ist. Zweitens (oder im Idealfall durch die Anzahl nicht vertrauenswürdiger Quellcode-Quellen), die Klassen in gepatchte Klassen umwandeln oder anstelle von normalen Klassen ihre spezielle gepatchte Ausgabe bereitstellen. Und zuletzt für System Classloader, die Routine tatsächlich tun wird.

Vergessen Sie auch nicht, Classloader.getSystemClassLoader zu schützen. Und zum Transformieren von Objekten können Sie Java Reflection API oder objectweb asm library verwenden.

+0

ClassLoader scheint, als wäre es auf dem richtigen Weg. Nicht daran interessiert, Klassen direkt zu verändern. – wrschneider

+0

Warum nicht? Es sieht wie ein einfacher und klarer Weg aus. – cdkrot

+0

Passt das zu Ihren Bedürfnissen? [link] (http://stackoverflow.com/questions/17045334/restrict-execution-of-a-method-with-java-annotations?rq=1) – cdkrot

0

Wenn das etwas ist, die Sie suchen

@PreAuthorize("hasRole('ROLE_USER')") 
public void create(Contact contact); 

Sie vielleicht einen Blick auf Spring Security nehmen wollen, Expression-Based Access Control

+0

Nein, ich suche nicht, wer die Methode ausführen kann - Ich suche, was die Methode selbst tun kann, sobald sie ausgeführt wird. – wrschneider

1

Die Java-Sandbox ist ein Werkzeug für genau dies. Es kann verwendet werden, um nur Zugriff auf eine Reihe von White-Listed-Klassen und Ressourcen für eingeschränkte Methoden zu ermöglichen. Es verwendet ein System mit einem benutzerdefinierten Klassenladeprogramm und einem Sicherheitsmanager, um dies zu erreichen. Keine Byte-Code-Manipulation oder ähnliche Tricks sind notwendig.

Ich habe es nicht benutzt, aber es sieht gut gestaltet und einigermaßen gut dokumentiert.

Beispielcode von seiner Webseite:

class Untrusted extends SandboxedEnvironment<Object>() { 
    @Override 
    public Object execute() { 
     /* untrusted code */ 
     return null; 
    } 
}; 

service.runSandboxed(Untrusted.class, context); 
Verwandte Themen