Próbuję zrozumieć podstawy bezpieczeństwa Java i AccessController.doPrivileged() Wykorzystanie Zacząłem przykładowy programAccessController Wykorzystanie
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;
}
}
);
}
}
jeśli próbuję uruchomić powyższy kod bezpieczeństwa przy użyciu domyślnego zarządzać Dostaję AccessControlException Moja StackTrace jest
C:\>java -Djava.security.manager AccessSystemProperty
[email protected]
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)
uprzejmie mi pomóc, aby uzyskać jasny obraz
1) kiedy potrzebujemy użyć AccessController.doPrivileged()?. (jeżeli SecurityManager jest obecny, używamy AccessController.doPrivileged, dlaczego to się nie udaje w powyższym przykładzie) 2) jaka jest prawdziwa korzyść, którą uzyskujemy za pomocą AccessController i PrivilegedAction ?. 3) Czy potrzebujemy niestandardowego pliku zasad, aby powyższy przykład zadziałał? Dzięki Paul
Cześć Rob, dzięki za tak jasne i szczegółowe wyjaśnienie. Zawsze próbowałem z klasy pojedynczej, więc nie byłem w stanie rozgryźć różnicy. Kiedy włączamy domyślny menedżer bezpieczeństwa (przy użyciu -Djava.security.manager) czy istnieje jakiś plik zasad, który jest używany do ograniczania dostępu? (Który jest częścią JDK) <"> "menedżer bezpieczeństwa sprawdzi stos, aby zobaczyć, czy każda klasa wyżej na stosie ma właściwość PropertyPermission ". <"> Tutaj odnoszą się StackTraceElement [] z Thread.currentThread(). GetStackTrace(); Albo pamięć Stack? Czy mógłbyś wyjaśnić to trochę? –
@PaulErric domyślne pliki zasad są zdefiniowane w pliku java.security i są (zwykle) policy.url.1 = file: $ {java.home} /lib/security/java.policy policy.url.2 = file : $ {user.home} /. java.policy. Ten link ma więcej: http://docs.oracle.com/javase/1.4.2/docs/guide/security/PolicyFiles.html#DefaultImpl.Przez stos rozumiem sekwencję wywołującą metody, które można zobaczyć w układach stacktraceelements. –