java之jvm学习笔记(策略和保护域)(二)

2014-11-24 10:41:03 · 作者: · 浏览: 2
s are concatenated.
*/
private transient java.security.cert.Certificate certs[] = null;//证书

Policy:策略,就是用来读取策略文件的一个单例对象,通过传入的CodeSource对象(由于codeSource对象里包含了签名者和代码来源)所以他通过读取grant段,取出一个个的Perssiom然后返回一个PerssiomCollection。这个类里有一个很重要的成员变量
// Cache mapping ProtectionDomain to PermissionCollection
private WeakHashMap pdMapping;

这个成员为什么重要,我们来看一个方法
private static void initPolicy (final Policy p) {
......

if (policyDomain.getCodeSource() != null) {
.......
synchronized (p.pdMapping) {
// cache of pd to permissions
p.pdMapping.put(policyDomain, policyPerms);
}
}
return;
}

我们主要看关键代码。这个pdMapping就是把保护域对象当做key将权限集合当做value存在在了这个map里。所以我们说一个保护域对应多个策略文件的grant子句的permission。
ProtectionDomain:保护域,前面我们已经介绍过了,他就是用来容纳class文件,还有perssiom,codeSource的一个对象,如果你对此还有什么疑问,我们也看看它的代码,来验证一下我们的结论
public class ProtectionDomain {

/* CodeSource */
private CodeSource codesource ;//代码源

/* ClassLoader the protection domain was consed from */
private ClassLoader classloader;//类装载器
/* Principals running-as within this protection domain */
private Principal[] principals;

/* the rights this protection domain is granted */
private PermissionCollection permissions;//权限集合
Permission:权限,这个对应了我们笔记九里的grant子句里的一个permission,它的结构也很简单,权限名和动作,就好像我们笔记九里的java.io.FilePermission是一个权限名
而动作则是read和write,在Permission中它对应一个字符串。
现在我们用一张图来把上面几个概念串联起来


到这里我们已经有一条比较完整的思路了,从笔记四到这一节的笔记十,我们所要说的都只有一件事情,类装载器在装载类的时候(或者执行类)会调用安全管理器,安全管理器,则通过判断策略来判断我们是不是允许加载这个类,或者执行某些操作,笔记某个文件的读写啊之类的(这个在笔记九的时候我们已经做过实验了)。那么你有没有这样的疑问,到底安全管理器是怎么样去调用策略的?这里我们不得不提出一个新的概念访问控制器AccessControl,如果你想知道访问控制器是干什么的,做什么工作,怎么和安全管理进行合作,那么请你阅读下一节。