AccessController-Nutzung
Ich versuche zu verstehen, die Grundlagen der java-Sicherheit und AccessController.doPrivileged() Verwendung
begonnen habe ich mit einem Beispielprogramm
import java.security.AccessController;
import java.security.PrivilegedAction;
public class AccessSystemProperty {
public static void main(String[] args) {
System.out.println(System.getSecurityManager());
AccessController.doPrivileged(
new PrivilegedAction<Boolean>(){
public Boolean run(){
System.out.println(System.getProperty("java.home"));
return Boolean.TRUE;
}
}
);
}
}
wenn ich versuche, führen Sie obige code mit Standard-Sicherheit zu verwalten, bin ich immer AccessControlException
Mein stacktrace ist
C:\>java -Djava.security.manager AccessSystemProperty
java.lang.SecurityManager@923e30
Exception in thread "main" java.security.AccessControlException: access denied (
java.util.PropertyPermission java.home read)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPropertyAccess(Unknown Source)
at java.lang.System.getProperty(Unknown Source)
at AccessSystemProperty$1.run(AccessSystemProperty.java:9)
at AccessSystemProperty$1.run(AccessSystemProperty.java:8)
at java.security.AccessController.doPrivileged(Native Method)
at AccessSystemProperty.main(AccessSystemProperty.java:6)
Bitte helfen Sie mir, um sich ein klares Bild von
1), wenn, dann brauchen wir AccessController.doPrivileged() ?.(wenn SecurityManager vorhanden ist, verwenden wir AccessController.doPrivileged, warum diese nicht obigen Beispiel )
2) was ist der eigentliche Vorteil, den wir bekommen durch die Verwendung von AccessController und PrivilegedAction?.
3) brauchen wir benutzerdefinierten Richtliniendatei für das obige Beispiel funktioniert ?
Vielen Dank,
Paul
InformationsquelleAutor der Frage Paul Erric | 2012-01-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie AccessController.doPrivileged (), um bestimmte code-Privilegien, der code weiter oben in der Aufruf-stack NICHT aber die der privilegierten codes HAT aufgrund dieser Privilegien gewährt, die in einer Richtlinie.
Nehmen wir beispielsweise an, ClassA ruft Methoden auf ClassB und ClassB Lesen muss die java.- home-system Eigenschaft (zu borgen von eurem Beispiel), und davon ausgehen, dass Sie angegeben haben, dass SecurityManager vorhanden ist, wie pro Ihre Beispiel.
Auch annehmen, dass die Klasse geladen wird, aus einem Topf namens "classb.jar" (aber um das Beispiel Arbeit ClassA NICHT geladen ist, aus dem Glas), das folgende sollte in die security-policy-Datei:
Nun, wenn ClassB läuft und versucht, ein System zu tun.getProperty (), die NICHT verpackt in eine AccessController.doPrivileged() auf "java".Zuhause". der security manager wird den stack überprüfen, um zu sehen, ob jede Klasse höher auf dem Stapel PropertyPermission (ob direkt oder implizit) für "java.Zuhause". Wenn nicht, schlägt der Zugriff fehl.
Jedoch, wenn Klasse B schließt das System.getProperty() in eine AccessController.doPrivileged() der securitymanager nur stört, dass die policy-Datei gibt ClassB, Privileg und so der Zugriff erlaubt ist.
Hier ist ein fragment, um dies zu zeigen:
So, in dem Fall von deinem Beispiel, müssen Sie nur geben Sie eine policy-Datei, enthält etwas ähnliches wie die Erteilung Strophe, die ich oben verwiesen.
InformationsquelleAutor der Antwort Rob H