上面有提到,在Java 中每个 Class都保存有 ProtectionDomain的引用,这里 ClassA 和 ClassB 的 ProtectionDomain 模型如下:
下面假设 ClassB 调用 ClassA 的去写 x.poperties 文件,那么 AccessControlContext 和 PermissionCollection 对应模型是这样的:
当 AccessController.checkPermission 开始检查权限时,它知道要本次要检查的权限是 FilePermission(“x.properties”, “write”),即对 “x.properties”的写权限。于是它先获取调用过程上下文中所有类(main(JVM)-->ClassB-->ClassA-->FileOutputStream-->AccessController)的 ProtectedDomain 找出来:
JVM 从 mian 执行的,它的 ProtectedDomain 是 SystemDomain
ClassA 的 ProtectedDomain 是 ProtectedDomainA
ClassB 的 ProtectedDomain 是 ProtectedDomainB
FileInputStream 和 AccessController 的 ProtectedDomain 是 SystemDomain
把访问上下文的 ProtectedDomain 都找出来后,就逐个检查每个 ProtectedDomain 是否有 FilePermission(“x.properties”, “write”) 权限。因为在 Java 访问控制机制中,它要确保每个调用的类都有该权限才能通过检查。
于是,开始做下面检查:
1) AccessController-->SystemDomain : Java 内部代码保护域,具有所有操作权限,检查通过
2) FileInputStream-->SystemDomain : Java 内部代码保护域,具有所有操作权限,检查通过
3) ClassA-->ProtectedDomainA: 在上面的 ProtectedDomainA 模型中,我们知道它是有 FilePermission(“x.properties”, “write”) 权限的,检查通过
4) ClassB-->ProtectedDomainB: 在上面的 ProtectedDomainB 模型中,我们知道它没有 FilePermission(“x.properties”, “write”) 权限的,检查不通过