2013-09-03 12 views
6

Ich baue eine SWING-Anwendung und muss auch einen benutzerdefinierten SecurityManager schreiben. Wenn ich eine leere Klasse schreiben, die Security wie diesJava SecurityManager @Override öffentliche void checkPermission (Permission Permission)

public class Sandbox extends SecurityManager {} 

Sinn erstreckt es funktioniert gut, dass die GUI korrekt wiedergegeben wird und alle Privilegien wie I/O widerrufen werden. Allerdings muss ich die checkPermission-Methode anpassen und wenn ich es überschreibe nichts mehr funktioniert ... Warum sollte so etwas nicht funktionieren?

public class Sandbox extends SecurityManager { 
    @Overide 
    public void checkPermission(Permission perm) { 
    super.checkPermission(perm); 
    } 
} 

Update: ein sehr einfaches Beispiel, das das Problem zeigt, ist dies

public static void main(String[] args) { 

    System.setSecurityManager(new SecurityManager() { 
     @Override 
     public void checkPermission(Permission p) { 
      if (some_condition_here) { 
       // Do something here 
      } else { 
       // Resort to default implementation 
       super.checkPermission(p); 
      } 
     } 
    }); 

    new JFrame().setVisible(true); 

} 

die „check“ Methode Entfernen der Anwendung richtig funktioniert, aber ich kann wirklich nicht meinen Kopf bekommen diese um.

+0

Für bessere Hilfe früher, post ein [SSCCE] (http://sscce.org/). –

+0

Ich habe die Frage mit einem Beispiel aktualisiert – Flavio

+0

Dies könnte auch interessant sein http://docs.oracle.com/javase/7/docs/technotes/guides/security/smPortGuide.html – mike

Antwort

0

Wenn Sie die Superklasse 'checkPermission(p) aufrufen, müssen Sie die Klasse nicht zuerst überschreiben. Kommentieren Sie es, dann funktioniert es.

Die superclas' Anrufe java.security.AccessController.checkPermission(perm) und das scheint eine java.security.AccessControlException zu werfen, wenn sie nicht von java.lang.SecurityManager aufgerufen

in meinem Fall heißt es:

Could not load Logmanager "null" 
java.security.AccessControlException: access denied (java.util.PropertyPermission java.util.logging.manager read) 

usw.

public class SecurityManagerExample 
{ 
    public static void main(String[] args) 
    { 
    System.setSecurityManager(new SecurityManager() 
    { 
     @Override 
     public void checkPermission(Permission p) 
     { 
     //super.checkPermission(p); 
     } 
    }); 

    new JFrame().setVisible(true); 
    } 
} 

gefunden a tutorial zum Schreiben eines Sicherheits-Managers. Ich würde Ihnen auch empfehlen, das Java-Dokument und die Beispiele von Oracle zu lesen.


UPDATE

Werfen Sie einen Blick auf die method summary und überschreiben Sie die Funktionalität, die Sie verbieten wollen. Wie ich herausgefunden habe Sie auch müssen explizit die Funktionalität, die Sie haben möchten.

Hier ein Beispiel:

public class SecurityManagerExample 
{ 

    public static void main(String[] args) 
    { 
    System.setSecurityManager(new SecurityManager() 
    { 
     @Override 
     public void checkWrite(String file) { 
     // no exception is thrown, i. e. creating files is allowed in general 
     } 

     @Override 
     public void checkDelete(String file) 
     { 
     if (file.equals("test.xml")) 
     { 
      throw new SecurityException("Not allowed to delete test.xml!"); 
     } 
     } 
    }); 

    File f = new File("test.xml"); 
    try 
    { 
     f.createNewFile(); 
    } 
    catch (IOException e) 
    { 
    } 

    f.delete(); 

    } 
} 

OUTPUT

Exception in thread "main" java.lang.SecurityException: Not allowed to delete test.xml! 
    at main.SecurityManagerExample$1.checkDelete(SecurityManagerExample.java:60) 
    at java.io.File.delete(File.java:902) 
    at main.SecurityManagerExample.main(SecurityManagerExample.java:74) 
+0

Danke mike, ich bin schon durch dieses Tutorial gegangen, aber leider war es nicht hilfreich :(Jedenfalls habe ich mein Code-Snippet aktualisiert, um klarzustellen, dass ich nicht einfach super.checkPermission (p) aufrufen muss; Innerhalb dieser Methode, aber mein Beispiel, was nur eine Vereinfachung. Und btw "kommentieren" hat die gleiche Wirkung der Ausführung des Programms ohne SecurityManager überhaupt – Flavio

+0

Dann überprüfen Sie den anderen Link, den ich unter Ihrer Frage gepostet. Plus die Java-Doc und dort ist auch ein weiteres Tutorial auf Oracle http://docs.oracle.com/javase/tutorial/essential/environment/security.html – mike

+0

Seit Sie Ihren Kommentar aktualisiert: Was ich sage ist, wenn Sie uns wollen Die Funktionalität der Basisklasse erweitern Sie nicht. Wenn Sie es erweitern möchten, dann schreiben Sie eigene Richtlinien darüber, was erlaubt ist oder nicht. Wenn Sie nur einen Sonderfall verbieten wollen. Sie müssen eine andere Methode überschreiben. Da alle Methoden schließlich 'checkPermission' aufrufen, ist es nicht einfach, sie zu überschreiben. – mike

1

Die Berechtigungen werden basierend auf den gesamten Code auf dem Stack gewährt. Alle Anrufer müssen die erforderliche Erlaubnis haben. Wenn Sie die Methode überschreiben und die Superklassenmethode aufrufen, befindet sich Ihr Code ebenfalls auf dem Stack, was bedeutet, dass Ihre Codebasis (zu der Ihr benutzerdefinierter SecurityManager gehört) die Berechtigung haben muss, nach der Sie (Ihre Anrufer) fragen.

Das ist der Unterschied zwischen dem Überschreiben oder nicht. Wenn Sie diese Methode nicht überschreiben, befindet sich nur der Code des (möglicherweise privilegierten) Aufrufers auf dem Stapel und er erhält die angeforderte Berechtigung. Wenn Sie diese Methode überschreiben, befindet sich Ihr Code ebenfalls auf dem Stack und muss ebenfalls berechtigt sein.

Wenn Sie also einen benutzerdefinierten SecurityManager implementieren möchten, der die geerbte Prüfmethode aufruft, müssen Sie die vererbte (richtlinienbasierte) Logik konfigurieren, um Ihrem SecurityManager alle Berechtigungen zu geben, die er gewähren sollte. Es wird empfohlen, den SecurityManager vom Rest der Anwendung in eine andere Codebasis zu trennen, so dass nur der SecurityManager und sonst nichts die großzügigen Berechtigungen erhält.

+0

Also muss er im Grunde alle möglichen Anfragen an den Sicherheitsmanager abdecken. Aber deine Antwort klingt professioneller! +1 – mike

+0

Immer noch, von Oracle-Dokumentation schlagen sie vor, (zum Beispiel) super.checkRead() von öffentlichen void checkRead (String-Datei) aufrufen. Und ich bekomme immer wieder die gleiche Ausnahme – Flavio

+0

Wie Holger sagte, wird alles auf dem Stack auf die Erlaubnis überprüft. Sie müssen sie also auch in der Unterklasse implementieren. – mike