【发布时间】:2012-01-02 16:44:05
【问题描述】:
我正在尝试了解 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 我的堆栈跟踪是
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) 上述示例是否需要自定义策略文件才能正常工作?
谢谢,
保罗
【问题讨论】: