java.lang.Object java.security.Policy
public abstract class Policy
Policy 对象负责确定在 Java 运行时环境中执行的代码是否有权执行安全敏感的操作。
任意给定时刻只有一个 Policy 对象安装在运行时中。可以通过调用 setPolicy
方法安装 Policy 对象。安装的 Policy 对象可以通过调用 getPolicy
方法获得。
如果尚未在运行时中安装任何 Policy 对象,那么将调用 getPolicy
安装默认 Policy 实现的实例(此抽象类的默认子类实现)。 通过将 "policy.provider" 安全属性(在 Java 安全属性文件中)的值设置为所需 Policy 子类实现的完全限定名,可以更改默认 Policy 实现。Java 安全属性文件位于名为 <JAVA_HOME>/lib/security/java.security 的文件中。 <JAVA_HOME> 引用 java.home 系统属性的值,并指定 JRE 的安装目录。
应用程序代码可以直接子类化 Policy,提供定制的实现。此外,通过调用某一个 getInstance
工厂方法并使用标准类型作为参数,可以构建一个 Policy 对象的实现。默认策略类型是 "JavaPolicy"。有关标准 Policy 类型列表,请参阅 Java Cryptography Architecture API Specification & Reference 的附录 A。
安装了 Policy 实例后(通过默认安装或调用 setPolicy
),在需要确定执行代码(封装在 ProtectionDomain 中)是否可以执行受保护 SecurityManager 操作时,Java 运行时将调用其 implies
。Policy 对象如何获取其策略数据由 Policy 实现本身决定。策略数据可以存储在纯 ASCII 文件中、Policy 类的序列化二进制文件中、数据库中等等。
refresh
方法使 Policy 对象刷新/重载其数据。 此操作与实现有关。例如,如果 Policy 对象将其数据存储在配制文件中,那么调用 refresh
将导致重读配制策略文件。如果不支持刷新操作,那么此方法不执行任何操作。注意,刷新策略对特定 ProtectionDomain 中的类可能无效。这取决于 Policy 提供者的 implies
方法实现及其 PermissionCollection 缓存策略。
Provider
,
ProtectionDomain
,
Permission
嵌套类摘要 | |
---|---|
static interface |
Policy.Parameters 此类表示用于 Policy 参数的标记接口。 |
字段摘要 | |
---|---|
static PermissionCollection |
UNSUPPORTED_EMPTY_COLLECTION 一个空的只读 PermissionCollection 实例。 |
构造方法摘要 | |
---|---|
Policy() |
方法摘要 | |
---|---|
static Policy |
getInstance(String type, Policy.Parameters params) 返回指定类型的 Policy 对象。 |
static Policy |
getInstance(String type, Policy.Parameters params, Provider provider) 返回指定类型的 Policy 对象。 |
static Policy |
getInstance(String type, Policy.Parameters params, String provider) 返回指定类型的 Policy 对象。 |
Policy.Parameters |
getParameters() 返回 Policy 参数。 |
PermissionCollection |
getPermissions(CodeSource codesource) 返回一个 PermissionCollection 对象,它包含授予指定 CodeSource 的权限集。 |
PermissionCollection |
getPermissions(ProtectionDomain domain) 返回一个 PermissionCollection 对象,它包含授予指定 ProtectionDomain 的权限集。 |
static Policy |
getPolicy() 返回安装的 Policy 对象。 |
Provider |
getProvider() 返回此 Policy 的 Provider。 |
String |
getType() 返回此 Policy 的类型。 |
boolean |
implies(ProtectionDomain domain, Permission permission) 计算授予 ProtectionDomain 的权限的全局策略,并测试是否授予了该权限。 |
void |
refresh() 刷新/重新加载策略配置。 |
static void |
setPolicy(Policy p) 设置系统范围的 Policy 对象。 |
从类 java.lang.Object 继承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
字段详细信息 |
---|
public static final PermissionCollection UNSUPPORTED_EMPTY_COLLECTION
构造方法详细信息 |
---|
public Policy()
方法详细信息 |
---|
public static Policy getPolicy()
setPolicy
更改。此方法首先使用
SecurityPermission("getPolicy")
权限调用
SecurityManager.checkPermission
来保证可以获取 Policy 对象。
SecurityException
- 如果安全管理器存在并且其
checkPermission
方法不允许获取 Policy 对象。
SecurityManager.checkPermission(Permission)
,
setPolicy(java.security.Policy)
public static void setPolicy(Policy p)
SecurityPermission("setPolicy")
权限调用
SecurityManager.checkPermission
来保证可以设置 Policy。
p
- 新的系统 Policy 对象。
SecurityException
- 如果安全管理器存在并且其
checkPermission
方法不允许设置 Policy。
SecurityManager.checkPermission(Permission)
,
getPolicy()
public static Policy getInstance(String type, Policy.Parameters params) throws NoSuchAlgorithmException
此方法从首选 Provider 开始,遍历已注册安全提供者列表。返回一个封装 PolicySpi 实现的新 Policy 对象,该实现取自第一个支持指定类型的 Provider。
注意,已注册提供者列表可以通过 Security.getProviders()
方法获得。
type
- 指定的 Policy 类型。有关标准 Policy 类型列表,请参阅
Java Cryptography Architecture API Specification & Reference 的附录 A。
params
- Policy 的参数,可以为 null。
SecurityException
- 如果调用者无权获取指定类型的 Policy 实例。
NullPointerException
- 如果指定类型为 null。
IllegalArgumentException
- 如果选定 Provider 的 PolicySpi 实现不理解指定的参数。
NoSuchAlgorithmException
- 如果没有任何 Provider 支持指定类型的 PolicySpi 实现。
Provider
public static Policy getInstance(String type, Policy.Parameters params, String provider) throws NoSuchProviderException, NoSuchAlgorithmException
返回一个封装 PolicySpi 实现的新 Policy 对象,该实现取自指定提供者。注意,指定的提供者必须已在安全提供者列表中注册。
注意,已注册提供者列表可以使用 Security.getProviders()
方法获得。
type
- 指定的 Policy 类型。有关标准 Policy 类型列表,请参阅
Java Cryptography Architecture API Specification & Reference 的附录 A。
params
- Policy 的参数,可以为 null。
provider
- 提供者。
SecurityException
- 如果调用者无权获取指定类型的 Policy 实例。
NullPointerException
- 如果指定类型为 null。
IllegalArgumentException
- 如果指定提供者为 null 或空,或者指定提供者的 PolicySpi 实现不理解指定的参数。
NoSuchProviderException
- 如果指定提供者没有在安全提供者列表中注册。
NoSuchAlgorithmException
- 如果指定提供者不支持指定类型的 PolicySpi 实现。
Provider
public static Policy getInstance(String type, Policy.Parameters params, Provider provider) throws NoSuchAlgorithmException
返回一个封装 PolicySpi 实现的新 Policy 对象,该实现取自指定 Provider 对象。注意,指定的 Provider 对象无需在提供者列表中注册。
type
- 指定的 Policy 类型。有关标准 Policy 类型列表,请参阅
Java Cryptography Architecture API Specification & Reference 的附录 A。
params
- Policy 的参数,可以为 null。
provider
- Provider。
SecurityException
- 如果调用者无权获取指定类型的 Policy 实例。
NullPointerException
- 如果指定类型为 null。
IllegalArgumentException
- 如果指定的 Provider 为 null,或者指定 Provider 的 PolicySpi 实现不理解指定的参数。
NoSuchAlgorithmException
- 如果指定的 Provider 不支持指定类型的 PolicySpi 实现。
Provider
public Provider getProvider()
只有通过调用 Policy.getInstance
获取的 Policy 实例才有 Provider。否则此方法返回 null。
public String getType()
只有通过调用 Policy.getInstance
获取的 Policy 实例才有类型。否则此方法返回 null。
public Policy.Parameters getParameters()
只有通过调用 Policy.getInstance
获取的 Policy 实例才有参数。否则此方法返回 null。
public PermissionCollection getPermissions(CodeSource codesource)
建议应用程序不要调用此方法,因此并非所有策略实现都支持此操作。 应用程序只能依赖 implies
方法执行策略检查。如果应用程序不得不调用 getPermissions 方法,那么它应该调用 getPermissions(ProtectionDomain)
。
此方法的默认实现返回 Policy.UNSUPPORTED_EMPTY_COLLECTION。如果策略实现可以返回授予 CodeSource 的权限组,则可以重写此方法。
codesource
- 已授予返回 PermissionCollection 的 CodeSource。
public PermissionCollection getPermissions(ProtectionDomain domain)
建议应用程序不要调用此方法,因此并非所有策略实现都支持此操作。 应用程序应依赖 implies
方法执行策略检查。
此方法的默认实现首先获取 getPermissions(CodeSource)
(CodeSource 取自指定的 ProtectionDomain)返回的权限,以及位于指定 ProtectionDomain 中的权限。 然后组合所有这些权限,并在一个新的 PermissionCollection 对象中返回。如果 getPermissions(CodeSource)
返回 Policy.UNSUPPORTED_EMPTY_COLLECTION,那么此方法在一个新的 PermissionCollection 对象中返回包含在指定 ProtectionDomain 中的权限。
如果策略实现支持返回授予 ProtectionDomain 的权限组,则可以重写此方法。
domain
- 已授予返回 PermissionCollection 的 ProtectionDomain。
ProtectionDomain
,
SecureClassLoader
public boolean implies(ProtectionDomain domain, Permission permission)
domain
- 要测试的 ProtectionDomain
permission
- 要测试其暗含权限的 Permission 对象。
ProtectionDomain
public void refresh()
refresh
将导致重新读取该文件。
此方法的默认实现不执行任何操作。如果策略实现支持刷新操作,则可以重写此方法。