访问控制器用法
我正在尝试了解Java安全性和AccessController.doPrivileged()用法的基础知识,我从一个示例程序开始
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;
}
}
);
}
}
如果我尝试使用默认安全管理运行上面的代码,我得到的是AccessControlException我的stacktrace是
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)
请帮助我清楚地了解
1) 当我们需要使用 AccessController.doPrivileged() 时?(如果 SecurityManager 存在,我们使用 AccessController.doPrivileged - 为什么在上面的例子中失败了)
2)通过使用AccessController和PrivilegedAction,我们获得的真正优势是什么?
3)我们是否需要自定义策略文件才能使用上述示例?
谢谢
保罗