AccessController
类用于访问控制操作和决策。
更具体地说,AccessController
类用于三个目的:
- 根据当前生效的安全策略决定是否允许或拒绝对关键系统资源的访问,
- 将代码标记为“特权”,从而影响后续的访问决策,以及
- 获取当前调用上下文的“快照”,以便可以基于保存的上下文对来自不同上下文的访问控制决策进行。
checkPermission
方法确定指定权限所指示的访问请求是否应该被授予或拒绝。下面是一个示例调用。在这个例子中,checkPermission
将确定是否授予对“/temp”目录中名为“testFile”的文件的“读取”访问权限。
FilePermission perm = new FilePermission("/temp/testFile", "read"); AccessController.checkPermission(perm);
如果允许请求的访问,checkPermission
会安静地返回。如果被拒绝,将抛出一个AccessControlException
。如果请求的权限类型不正确或包含无效值,也会抛出AccessControlException
。尽可能提供此类信息。假设当前线程遍历了m个调用者,按照调用者1到调用者m的顺序。然后调用者m调用了checkPermission
方法。checkPermission
方法根据以下算法确定是否授予或拒绝访问:
for (int i = m; i > 0; i--) {
if (调用者i的域没有该权限)
抛出AccessControlException
else if (调用者i被标记为特权) {
if (在调用doPrivileged时指定了上下文)
context.checkPermission(permission)
if (在调用doPrivileged时指定了有限权限) {
for (每个有限权限) {
if (有限权限包含请求的权限)
返回;
}
} else
返回;
}
}
// 接下来,检查线程创建时继承的上下文。
// 每当创建新线程时,那时的AccessControlContext被存储并与新线程关联,作为“继承”上下文。
inheritedContext.checkPermission(permission);
调用者可以被标记为“特权”(参见doPrivileged(java.security.PrivilegedAction)
及以下)。在进行访问控制决策时,如果到达了通过doPrivileged
调用而被标记为“特权”的调用者,且该调用者的域具有指定权限,并且至少一个限制权限参数(如果有的话)包含请求的权限,则checkPermission
停止检查,并安静地返回,表示允许请求的访问。如果该域没有指定权限,则会抛出异常,如常规情况。如果调用者的域具有指定权限,但在调用doPrivileged
时没有任何限制权限参数暗示请求的权限,则权限检查将继续,直到没有更多的调用者或另一个doPrivileged
调用匹配请求的权限并正常返回。
“特权”功能的正常使用如下。如果您不需要在“特权”块内返回值,请执行以下操作:
somemethod() {
...这里是正常代码...
AccessController.doPrivileged(new PrivilegedAction<Void>() {
public Void run() {
// 特权代码在这里,例如:
System.loadLibrary("awt");
return null; // 没有返回值
}
});
...这里是正常代码...
}
PrivilegedAction
是一个具有名为run
的单个方法的接口。上面的示例显示了该接口的实现创建;提供了run
方法的具体实现。当调用doPrivileged
时,会将PrivilegedAction
实现的实例传递给它。doPrivileged
方法在启用权限后调用PrivilegedAction
实现的run
方法,并将run
方法的返回值作为doPrivileged
的返回值(在此示例中被忽略)。
如果需要返回一个值,可以执行以下操作:
somemethod() {
...这里是正常代码...
String user = AccessController.doPrivileged(
new PrivilegedAction<String>() {
public String run() {
return System.getProperty("user.name");
}
});
...这里是正常代码...
}
如果您的run
方法中执行的操作可能引发“已检查”异常(列在方法的throws
子句中),那么您需要使用PrivilegedExceptionAction
接口而不是PrivilegedAction
接口:
somemethod() throws FileNotFoundException {
...这里是正常代码...
try {
FileInputStream fis = AccessController.doPrivileged(
new PrivilegedExceptionAction<FileInputStream>() {
public FileInputStream run() throws FileNotFoundException {
return new FileInputStream("someFile");
}
});
} catch (PrivilegedActionException e) {
// e.getException()应该是FileNotFoundException的一个实例,
// 因为只有“已检查”异常会被“包装”在PrivilegedActionException中。
throw (FileNotFoundException) e.getException();
}
...这里是正常代码...
}
在使用“特权”构造时要非常小心,并始终记住将特权代码段尽可能缩小。您可以传递Permission
参数以进一步限制“特权”的范围(请参见下文)。
请注意,checkPermission
始终在当前执行线程的上下文中执行安全检查。有时应该在给定上下文中进行的安全检查实际上需要从一个不同的上下文中进行(例如,从一个工作线程中)。为此情况提供了getContext
方法和AccessControlContext
类。getContext
方法获取当前调用上下文的“快照”,并将其放入一个AccessControlContext
对象中,然后返回该对象。以下是一个示例调用:
AccessControlContext acc = AccessController.getContext()
AccessControlContext
本身有一个checkPermission
方法,根据其封装的上下文而不是当前执行线程的上下文做出访问决策。因此,不同上下文中的代码可以在先前保存的AccessControlContext
对象上调用该方法。以下是一个示例调用:
acc.checkPermission(permission)
有时您事先不知道要对上下文检查哪些权限。在这些情况下,您可以使用带有上下文的doPrivileged
方法。您还可以通过传递额外的Permission
参数来限制特权代码的范围。
somemethod() {
AccessController.doPrivileged(new PrivilegedAction<Object>() {
public Object run() {
// 代码在这里。在这个run方法中的任何权限检查都将要求调用者的保护域和快照的上下文的交集具有所需的权限。如果请求的权限不被限制的FilePermission参数暗示,则检查线程将继续超出doPrivileged的调用者。
}
}, acc, new FilePermission("/temp/*", read));
...这里是正常代码...
}
传递一个AllPermission
实例的限制Permission
参数等效于调用相应的不带限制Permission
参数的doPrivileged
方法。传递一个长度为零的Permission
数组会禁用代码特权,以便检查总是继续超出该doPrivileged
方法的调用者。
- 自版本:
- 1.2
- 参见:
-
Method Summary
Modifier and TypeMethodDescriptionstatic void
checkPermission
(Permission perm) 已弃用,将被移除:此API元素可能在将来的版本中被移除。确定是否应允许或拒绝由指定权限指示的访问请求,基于当前的AccessControlContext
和安全策略。static <T> T
doPrivileged
(PrivilegedAction<T> action) 已弃用,将被移除:此API元素可能在将来的版本中被移除。启用权限执行指定的PrivilegedAction
。static <T> T
doPrivileged
(PrivilegedAction<T> action, AccessControlContext context) 已弃用,将被移除:此API元素可能在将来的版本中被移除。启用权限执行指定的PrivilegedAction
,并受指定的AccessControlContext
限制。static <T> T
doPrivileged
(PrivilegedAction<T> action, AccessControlContext context, Permission... perms) 已弃用,将被移除:此API元素可能在将来的版本中被移除。启用权限执行指定的PrivilegedAction
,并受指定的AccessControlContext
限制,以及通过指定的Permission
参数限制特权范围。static <T> T
doPrivileged
(PrivilegedExceptionAction<T> action) 已弃用,将被移除:此API元素可能在将来的版本中被移除。启用权限执行指定的PrivilegedExceptionAction
。static <T> T
doPrivileged
(PrivilegedExceptionAction<T> action, AccessControlContext context) 已弃用,将被移除:此API元素可能在将来的版本中被移除。启用权限执行指定的PrivilegedExceptionAction
,并受指定的AccessControlContext
限制。static <T> T
doPrivileged
(PrivilegedExceptionAction<T> action, AccessControlContext context, Permission... perms) 已弃用,将被移除:此API元素可能在将来的版本中被移除。启用权限执行指定的PrivilegedExceptionAction
,并受指定的AccessControlContext
限制,以及通过指定的Permission
参数限制特权范围。static <T> T
doPrivilegedWithCombiner
(PrivilegedAction<T> action) 已弃用,将被移除:此API元素可能在将来的版本中被移除。执行指定的PrivilegedAction
,启用权限。static <T> T
doPrivilegedWithCombiner
(PrivilegedAction<T> action, AccessControlContext context, Permission... perms) 已弃用,将被移除:此API元素可能在将来的版本中被移除。执行指定的PrivilegedAction
,启用权限,并由指定的AccessControlContext
限制,并通过指定的Permission
参数限制特权范围。static <T> T
已弃用,将被移除:此API元素可能在将来的版本中被移除。执行指定的PrivilegedExceptionAction
,启用权限。static <T> T
doPrivilegedWithCombiner
(PrivilegedExceptionAction<T> action, AccessControlContext context, Permission... perms) 已弃用,将被移除:此API元素可能在将来的版本中被移除。执行指定的PrivilegedExceptionAction
,启用权限,并由指定的AccessControlContext
限制,并通过指定的Permission
参数限制特权范围。static AccessControlContext
已弃用,将被移除:此API元素可能在将来的版本中被移除。此方法获取当前调用上下文的“快照”,其中包括当前线程继承的AccessControlContext
和任何有限的特权范围,并将其放置在一个AccessControlContext
对象中。
-
Method Details
-
doPrivileged
Deprecated, for removal: This API element is subject to removal in a future version.执行指定的PrivilegedAction
,启用权限。该操作使用调用者保护域拥有的所有权限执行。如果操作的
run
方法引发(未检查的)异常,它将通过此方法传播。请注意,在执行操作时,与当前
AccessControlContext
关联的任何DomainCombiner
将被忽略。- 类型参数:
-
T
- 由PrivilegedAction的run
方法返回的值的类型。 - 参数:
-
action
- 要执行的操作。 - 返回:
-
操作的
run
方法返回的值。 - 抛出:
-
NullPointerException
- 如果操作为null
- 参见:
-
doPrivilegedWithCombiner
Deprecated, for removal: This API element is subject to removal in a future version.执行指定的PrivilegedAction
,启用权限。该操作使用调用者保护域拥有的所有权限执行。如果操作的
run
方法引发(未检查的)异常,它将通过此方法传播。在执行操作时,此方法保留当前AccessControlContext的
DomainCombiner
(可能为null)。- 类型参数:
-
T
- 由PrivilegedAction的run
方法返回的值的类型。 - 参数:
-
action
- 要执行的操作。 - 返回:
-
操作的
run
方法返回的值。 - 抛出:
-
NullPointerException
- 如果操作为null
- 自Java版本:
- 1.6
- 参见:
-
doPrivileged
Deprecated, for removal: This API element is subject to removal in a future version.执行指定的PrivilegedAction
,启用权限,并由指定的AccessControlContext
限制。该操作使用调用者保护域拥有的权限与指定的AccessControlContext
所代表的域拥有的权限的交集执行。如果操作的
run
方法引发(未检查的)异常,它将通过此方法传播。如果安装了安全管理器,并且指定的
AccessControlContext
不是由系统代码创建,并且调用者的ProtectionDomain
未被授予“createAccessControlContext”SecurityPermission
,则操作将不具备任何权限。- 类型参数:
-
T
- 由PrivilegedAction的run
方法返回的值的类型。 - 参数:
-
action
- 要执行的操作。 -
context
-表示要在执行指定操作之前应用于调用者域权限的限制的访问控制上下文。如果上下文为null
,则不会应用任何额外限制。 - 返回:
-
操作的
run
方法返回的值。 - 抛出:
-
NullPointerException
- 如果操作为null
- 参见:
-
doPrivileged
public static <T> T doPrivileged(PrivilegedAction<T> action, AccessControlContext context, Permission... perms) Deprecated, for removal: This API element is subject to removal in a future version.Performs the specifiedPrivilegedAction
with privileges enabled and restricted by the specifiedAccessControlContext
and with a privilege scope limited by specifiedPermission
arguments. The action is performed with the intersection of the permissions possessed by the caller's protection domain, and those possessed by the domains represented by the specifiedAccessControlContext
.If the action's
run
method throws an (unchecked) exception, it will propagate through this method.If a security manager is installed and the specified
AccessControlContext
was not created by system code and the caller'sProtectionDomain
has not been granted the "createAccessControlContext"SecurityPermission
, then the action is performed with no permissions.- Type Parameters:
-
T
- the type of the value returned by the PrivilegedAction'srun
method. - Parameters:
-
action
- the action to be performed. -
context
- an access control context representing the restriction to be applied to the caller's domain's privileges before performing the specified action. If the context isnull
, then no additional restriction is applied. -
perms
- thePermission
arguments which limit the scope of the caller's privileges. The number of arguments is variable. - Returns:
-
the value returned by the action's
run
method. - Throws:
-
NullPointerException
- if action or perms or any element of perms isnull
- Since:
- 1.8
- See Also:
-
doPrivilegedWithCombiner
public static <T> T doPrivilegedWithCombiner(PrivilegedAction<T> action, AccessControlContext context, Permission... perms) Deprecated, for removal: This API element is subject to removal in a future version.Performs the specifiedPrivilegedAction
with privileges enabled and restricted by the specifiedAccessControlContext
and with a privilege scope limited by specifiedPermission
arguments. The action is performed with the intersection of the permissions possessed by the caller's protection domain, and those possessed by the domains represented by the specifiedAccessControlContext
.If the action's
run
method throws an (unchecked) exception, it will propagate through this method.This method preserves the current AccessControlContext's
DomainCombiner
(which may be null) while the action is performed.If a security manager is installed and the specified
AccessControlContext
was not created by system code and the caller'sProtectionDomain
has not been granted the "createAccessControlContext"SecurityPermission
, then the action is performed with no permissions.- Type Parameters:
-
T
- the type of the value returned by the PrivilegedAction'srun
method. - Parameters:
-
action
- the action to be performed. -
context
- an access control context representing the restriction to be applied to the caller's domain's privileges before performing the specified action. If the context isnull
, then no additional restriction is applied. -
perms
- thePermission
arguments which limit the scope of the caller's privileges. The number of arguments is variable. - Returns:
-
the value returned by the action's
run
method. - Throws:
-
NullPointerException
- if action or perms or any element of perms isnull
- Since:
- 1.8
- See Also:
-
doPrivileged
public static <T> T doPrivileged(PrivilegedExceptionAction<T> action) throws PrivilegedActionException Deprecated, for removal: This API element is subject to removal in a future version.执行指定的PrivilegedExceptionAction
,启用权限。该操作将使用调用者保护域拥有的所有权限执行。如果操作的
run
方法抛出一个未检查的异常,它将通过此方法传播。请注意,在执行操作时,将忽略与当前
AccessControlContext
关联的任何DomainCombiner
。- 类型参数:
-
T
- PrivilegedExceptionAction的run
方法返回的值的类型。 - 参数:
-
action
- 要执行的操作 - 返回:
-
操作的
run
方法返回的值 - 抛出:
-
PrivilegedActionException
- 如果指定的操作的run
方法抛出一个已检查的异常 -
NullPointerException
- 如果操作为null
- 参见:
-
doPrivilegedWithCombiner
public static <T> T doPrivilegedWithCombiner(PrivilegedExceptionAction<T> action) throws PrivilegedActionException Deprecated, for removal: This API element is subject to removal in a future version.执行指定的PrivilegedExceptionAction
,启用权限。该操作将使用调用者保护域拥有的所有权限执行。如果操作的
run
方法抛出一个未检查的异常,它将通过此方法传播。在执行操作时,此方法保留当前
AccessControlContext
的DomainCombiner
(可能为null)。- 类型参数:
-
T
- PrivilegedExceptionAction的run
方法返回的值的类型。 - 参数:
-
action
- 要执行的操作。 - 返回:
-
操作的
run
方法返回的值 - 抛出:
-
PrivilegedActionException
- 如果指定的操作的run
方法抛出一个已检查的异常 -
NullPointerException
- 如果操作为null
- 自Java版本:
- 1.6
- 参见:
-
doPrivileged
public static <T> T doPrivileged(PrivilegedExceptionAction<T> action, AccessControlContext context) throws PrivilegedActionException Deprecated, for removal: This API element is subject to removal in a future version.执行指定的PrivilegedExceptionAction
,启用权限,并由指定的AccessControlContext
限制。该操作将使用调用者保护域拥有的权限与指定AccessControlContext
所代表的域拥有的权限的交集执行。如果操作的
run
方法抛出一个未检查的异常,它将通过此方法传播。如果安装了安全管理器,并且指定的
AccessControlContext
不是由系统代码创建的,且调用者的ProtectionDomain
未被授予"createAccessControlContext"SecurityPermission
,则操作将不具备任何权限。- 类型参数:
-
T
- PrivilegedExceptionAction的run
方法返回的值的类型。 - 参数:
-
action
- 要执行的操作 -
context
- 表示在执行指定操作之前应用于调用者域权限的限制的访问控制上下文。如果上下文为null
,则不会应用任何额外限制。 - 返回:
-
操作的
run
方法返回的值 - 抛出:
-
PrivilegedActionException
- 如果指定的操作的run
方法抛出一个已检查的异常 -
NullPointerException
- 如果操作为null
- 参见:
-
doPrivileged
public static <T> T doPrivileged(PrivilegedExceptionAction<T> action, AccessControlContext context, Permission... perms) throws PrivilegedActionException Deprecated, for removal: This API element is subject to removal in a future version.执行指定的PrivilegedExceptionAction
,启用权限,并由指定的AccessControlContext
限制,并且由指定的Permission
参数限制特权范围。该操作将使用调用者保护域拥有的权限与指定AccessControlContext
所代表的域拥有的权限的交集执行。如果操作的
run
方法抛出一个(未检查的)异常,它将通过此方法传播。如果安装了安全管理器,并且指定的
AccessControlContext
不是由系统代码创建的,且调用者的ProtectionDomain
未被授予"createAccessControlContext"SecurityPermission
,则操作将不具备任何权限。- 类型参数:
-
T
- PrivilegedExceptionAction的run
方法返回的值的类型。 - 参数:
-
action
- 要执行的操作。 -
context
- 表示在执行指定操作之前应用于调用者域权限的限制的访问控制上下文。如果上下文为null
,则不会应用任何额外限制。 -
perms
- 限制调用者权限范围的Permission
参数。参数数量可变。 - 返回:
-
操作的
run
方法返回的值。 - 抛出:
-
PrivilegedActionException
- 如果指定的操作的run
方法抛出一个已检查的异常 -
NullPointerException
- 如果操作或perms或perms的任何元素为null
- 自Java版本:
- 1.8
- 参见:
-
doPrivilegedWithCombiner
public static <T> T doPrivilegedWithCombiner(PrivilegedExceptionAction<T> action, AccessControlContext context, Permission... perms) throws PrivilegedActionException Deprecated, for removal: This API element is subject to removal in a future version.执行指定的PrivilegedExceptionAction
,启用权限,并由指定的AccessControlContext
限制,并且由指定的Permission
参数限制特权范围。该操作将使用调用者保护域拥有的权限与指定AccessControlContext
所代表的域拥有的权限的交集执行。如果操作的
run
方法抛出一个(未检查的)异常,它将通过此方法传播。在执行操作时,此方法保留当前
AccessControlContext
的DomainCombiner
(可能为null)。如果安装了安全管理器,并且指定的
AccessControlContext
不是由系统代码创建的,且调用者的ProtectionDomain
未被授予"createAccessControlContext"SecurityPermission
,则操作将不具备任何权限。- 类型参数:
-
T
- PrivilegedExceptionAction的run
方法返回的值的类型。 - 参数:
-
action
- 要执行的操作。 -
context
- 表示在执行指定操作之前应用于调用者域权限的限制的访问控制上下文。如果上下文为null
,则不会应用任何额外限制。 -
perms
- 限制调用者权限范围的Permission
参数。参数数量可变。 - 返回:
-
操作的
run
方法返回的值。 - 抛出:
-
PrivilegedActionException
- 如果指定的操作的run
方法抛出一个已检查的异常 -
NullPointerException
- 如果操作或perms或perms的任何元素为null
- 自Java版本:
- 1.8
- 参见:
-
getContext
Deprecated, for removal: This API element is subject to removal in a future version.该方法获取当前调用上下文的"快照",包括当前线程继承的AccessControlContext
和任何有限的特权范围,并将其放置在一个AccessControlContext
对象中。稍后可能在另一个线程中检查此上下文。- 返回:
-
基于当前上下文的
AccessControlContext
。 - 参见:
-
checkPermission
Deprecated, for removal: This API element is subject to removal in a future version.根据当前AccessControlContext
和安全策略确定是否应允许或拒绝指定权限所指示的访问请求。如果访问请求被允许,则此方法静默返回,否则会抛出AccessControlException
。AccessControlException
的getPermission
方法返回Permission
对象实例(perm
)。- 参数:
-
perm
- 请求的权限。 - 抛出:
-
AccessControlException
- 如果根据当前安全策略,指定的权限不被允许。 -
NullPointerException
- 如果指定的权限为null
,并且根据当前生效的安全策略进行检查。
-