JavaTM安全体系结构(JDK1.2)
4. 访问控制机制和算法
4.1 java.security.ProtectionDomain
-
-
这个类代表了Java应用环境中的一个保护单元,它典型地与 "主体(principal)" 的概念发生关联,这里的主体是在计算机系统中被授予许可的一个实体。
-
从概念上讲,一个域是一个类的集合,这些类的实例被授予了相同的许可集。目前,一个域单独地由一个代码来源(CodeSource)来鉴别,它封装了在该域中运行的代码的两个特性:代码基址(java.net.URL)和公共密钥证书集(属于java.security.cert.Certificate类型的),公共密钥对应于在该域中为所有代码签字的私有密钥。因而,由相同的密钥签字和来自相同URL的类被放在同一个域中。
-
一个域还包含在该域中授予代码的许可,它是由现行安全策略所决定的。
-
具有相同许可、但来自不同代码源的类属于不同的域。
-
一个类属于一个且仅属于一个ProtectionDomain。
-
注意:目前在JDK1.2中,保护域是作为一个类装载的结果"按要求"创建的。java.lang.Class中的getProtectionDomain方法可被用来查询与给定类相关联的保护域。 但你必须具有适当的许可(RuntimePermission "getProtectionDomain"),才能成功地调用该方法。
-
今天,作为JDK组成部分而提交的所有代码被认为是系统代码,它们运行于单独的系统域中。每个Applet和应用程序运行在它的适当的域中,这是由它的代码源所决定的。
-
有可能保证:在任意非系统域中的对象不能自动发现另一个非系统域中的对象。这种分割可通过仔细的类解析和装载而获得。例如,对不同的域使用不同的类装载器。然而,SecureClassLoader(或它的子类)可以(任其选择)从不同的域装载类,这样就允许这些类在相同名空间内共存(由类装载器分割)。
4.2 java.security.AccessController
-
使用AccessController类有三个目的,每个目的在下面都将被详述:
- 根据现行安全策略,决定是否允许对关键系统资源的访问。
- 将某些代码标识为 "特权" 代码,从而影响随后的访问决定。
- 获得当前调用上下文关系的"快照",这样可以根据不同的上下文关系来作出访问控制决定。
控制对系统资源访问的任何代码如果希望使用特别的安全模型或存取由AccessController方法调用的存取控制算法,则它应该调用AccessController方法。另一方面,如果应用程序希望将安全模型延迟到SecurityManager在运行时被安装,则它应该调用在SecurityManager中的相应的方法。
- 根据现行安全策略,决定是否允许对关键系统资源的访问。
-
例如,典型的调用访问控制的方法一直为如下代码(取自JDK的早期版本):
ClassLoader loader = this.getClass().getClassLoader(); if (loader != null) { SecurityManager security = System.getSecurityManager(); if (security != null) { security.checkRead("path/file"); } }
-
在新的体系结构下,无论是否有与一个调用类相关联的类装载器,都应该典型地调用检查。这可能是简单的,例如:
FilePermission perm = new FilePermission("path/file", "read"); AccessController.checkPermission(perm);
- 类Access