2013-09-03 10 views
6

Buduję aplikację SWING, a także muszę napisać niestandardowy program SecurityManager. Jeśli piszę pustą klasę, która rozciąga securityManager jak tenJava SecurityManager @Override public void checkPermission (Permission perm)

public class Sandbox extends SecurityManager {} 

to działa dobrze, co oznacza, że ​​GUI jest renderowany prawidłowo i wszystkie przywileje, takie jak I/O są odwołane. Jednak muszę dostosować metodę checkPermission i ilekroć nadpisuję to nic już nie działa ... Dlaczego coś takiego nie powinno działać?

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

Update: bardzo prosty przykład, który pokazuje problem jest ten

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); 

} 

Zdejmowanie „checkPermission” metody Aplikacja działa poprawnie, ale naprawdę nie mogę uzyskać moja głowa wokół tego.

+0

Aby uzyskać lepszą pomoc wcześniej, opublikuj [SSCCE] (http://sscce.org/). –

+0

Mam zaktualizowane pytanie z przykładem – Flavio

+0

Może to być również interesujące http://docs.oracle.com/javase/7/docs/technotes/guides/security/smPortGuide.html – mike

Odpowiedz

0

Jeśli zadzwonisz do superklasy "checkPermission(p), nie musisz najpierw przesłonić klasy. Skomentuj to, a następnie działa.

rozmowy java.security.AccessController.checkPermission(perm) i że wydaje się rzucać java.security.AccessControlException The superclas', gdy nie jest wywoływana przez java.lang.SecurityManager

w moim przypadku mówi:

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

itp

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); 
    } 
} 

znalazłem a tutorial o tym, jak napisać menedżera bezpieczeństwa. Poleciłbym ci także przejść przez dokument java doc i przykłady dostarczone przez Oracle.


UPDATE

Spójrz na method summary i zastąpić funkcjonalność chcesz zabronić. Jak się dowiedziałem, również trzeba jawnie zezwolić na funkcjonalność, którą chcesz mieć.

Oto przykład:

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(); 

    } 
} 

WYJŚCIE

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

Dzięki mike, przeszedłem już ten samouczek, ale niestety to nie było pomocne :(W każdym razie zaktualizowałem swój fragment kodu, aby było jasne, że nie muszę po prostu wywoływać super.checkPermission (p); w tej metodzie, ale mój przykład, co tylko uproszczenie, a przy okazji "skomentowanie go" ma taki sam efekt, jak uruchomienie programu bez menadżera SecurityManager – Flavio

+0

Następnie sprawdź drugi link, który opublikowałem pod twoim pytaniem, plus dokumentacja java i tam to także kolejny samouczek na temat oracle http://docs.oracle.com/javase/tutorial/essential/environment/security.html – mike

+0

Od czasu aktualizacji komentarza: mówię, że jeśli chcesz e funkcjonalność klasy bazowej, nie rozszerzaj jej. Jeśli chcesz go przedłużyć, napisz własne zasady dotyczące tego, co jest dozwolone lub nie. Jeśli chcesz tylko zabezpieczyć specjalny przypadek. Musisz zastąpić inną metodę. Ponieważ wszystkie metody nazywane są w końcu 'checkPermission', nie jest łatwo nadpisać je w odpowiedni sposób. – mike

1

Uprawnienia przyznawane są na podstawie wszystkich kodu na stosie. Wszyscy dzwoniący muszą mieć wymagane uprawnienia. Jeśli nadpisujesz metodę i wywołujesz metodę nadklasy, twój kod również znajduje się na stosie, co oznacza, że ​​twoja baza kodów (do której należy twój niestandardowy menedżer zabezpieczeń) musi mieć pozwolenie, o które prosisz (twoich dzwoniących).

Taka jest różnica między nadpisaniem lub nie. Jeśli nie zastąpisz tej metody, tylko (prawdopodobnie uprzywilejowany) kod wywołujący znajduje się na stosie i dostanie żądane pozwolenie. Jeśli nadpiszesz tę metodę, twój kod również znajduje się na stosie i również musi mieć pozwolenie.

jeśli chcesz wprowadzić niestandardową securityManager który wywołuje odziedziczoną metodę wyboru należy skonfigurować odziedziczony (polityka oparta) logiki, aby dać securityManager wszystkie uprawnienia powinny być w stanie udzielić Tak. Zaleca się oddzielenie programu SecurityManager od reszty aplikacji na inną bazę kodów, tak aby program SecurityManager i nic innego nie uzyskiwały hojnych uprawnień.

+0

Musi więc w zasadzie uwzględnić wszystkie możliwe żądania kierownika ds. Bezpieczeństwa. Ale twoja odpowiedź brzmi bardziej profesjonalnie! +1 – mike

+0

Jednak z dokumentacji Oracle sugerują wywoływanie (na przykład) super.checkRead() z publicznego void checkRead (plik String). I ciągle otrzymuję ten sam wyjątek, który został rzucony. – Flavio

+0

Jak powiedział Holger, wszystko na stosie zostaje sprawdzone w celu uzyskania pozwolenia. Więc musisz również zaimplementować je w podklasie. – mike