- java.lang.Object
-
- java.security.AccessController
-
public final class AccessController extends Object
AccessController类用于访问控制操作和决策。
更具体地说,AccessController类用于三个目的:
- 根据当前有效的安全策略,决定是允许还是拒绝对关键系统资源的访问,
- 将代码标记为“特权”,从而影响后续访问确定,以及
- 获得当前调用上下文的“快照”,以便可以针对保存的上下文进行来自不同上下文的访问控制决策。
checkPermission
方法确定是应该授予还是拒绝由指定权限指示的访问请求。 下面显示了一个示例调用。 在此示例中,checkPermission
将确定是否授予对“/ temp”目录中名为“testFile”的文件的“读取”访问权限。FilePermission perm = new FilePermission("/temp/testFile", "read"); AccessController.checkPermission(perm);
如果允许访问请求,
checkPermission
将安静地返回。 如果被拒绝,则抛出AccessControlException。 如果请求的权限类型不正确或包含无效值,也可以抛出AccessControlException。 尽可能提供此类信息。 假设当前线程遍历m个呼叫者,按呼叫者1到呼叫者2到呼叫者m的顺序。 然后调用者m调用checkPermission
方法。checkPermission
方法根据以下算法确定是授予还是拒绝访问:for (int i = m; i > 0; i--) { if (caller i's domain does not have the permission) throw AccessControlException else if (caller i is marked as privileged) { if (a context was specified in the call to doPrivileged) context.checkPermission(permission) if (limited permissions were specified in the call to doPrivileged) { for (each limited permission) { if (the limited permission implies the requested permission) return; } } else return; } } // Next, check the context inherited when the thread was created. // Whenever a new thread is created, the AccessControlContext at // that time is stored and associated with the new thread, as the // "inherited" context. inheritedContext.checkPermission(permission);
呼叫者可以被标记为“特权”(参见
doPrivileged
及以下)。 在进行访问控制决策时,checkPermission
方法停止检查是否通过没有上下文参数的doPrivileged
调用到达标记为“特权”的调用者(有关上下文参数的信息,请参阅下文)。 如果该调用者的域具有指定的权限,并且至少有一个限制权限参数(如果有)意味着所请求的权限,则不进行进一步检查,并且checkPermission
返回,表示允许所请求的访问。 如果该域没有指定的权限,则会像往常一样抛出异常。 如果调用者的域具有指定的权限,但调用doPrivileged
给出的任何限制权限参数都没有暗示,则权限检查将继续,直到没有更多的调用者或另一个doPrivileged
调用与所请求的权限匹配并正常返回。“特权”功能的正常使用如下。 如果您不需要从“特权”块中返回值,请执行以下操作:
somemethod() { ...normal code here... AccessController.doPrivileged(new PrivilegedAction<Void>() { public Void run() { // privileged code goes here, for example: System.loadLibrary("awt"); return null; // nothing to return } }); ...normal code here... }
PrivilegedAction是具有单个方法的接口,名为
run
。 上面的示例显示了该接口的实现的创建; 提供了run
方法的具体实现。 在调用doPrivileged
时,会doPrivileged
传递PrivilegedAction实现的实例。doPrivileged
方法在启用权限后从PrivilegedAction实现调用run
方法,并返回run
方法的返回值作为doPrivileged
返回值(在此示例中忽略)。如果需要返回值,可以执行以下操作:
somemethod() { ...normal code here... String user = AccessController.doPrivileged( new PrivilegedAction<String>() { public String run() { return System.getProperty("user.name"); } }); ...normal code here... }
如果在
run
方法中执行的操作可能抛出“已检查”异常(在方法的throws
子句中列出的异常),则需要使用PrivilegedExceptionAction
接口而不是PrivilegedAction
接口:somemethod() throws FileNotFoundException { ...normal code here... try { FileInputStream fis = AccessController.doPrivileged( new PrivilegedExceptionAction<FileInputStream>() { public FileInputStream run() throws FileNotFoundException { return new FileInputStream("someFile"); } }); } catch (PrivilegedActionException e) { // e.getException() should be an instance of FileNotFoundException, // as only "checked" exceptions will be "wrapped" in a // PrivilegedActionException. throw (FileNotFoundException) e.getException(); } ...normal code here... }
在使用“特权”构造时要非常小心,并且始终记住使特权代码部分尽可能小。 您可以传递
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() { // Code goes here. Any permission checks within this // run method will require that the intersection of the // caller's protection domain and the snapshot's // context have the desired permission. If a requested // permission is not implied by the limiting FilePermission // argument then checking of the thread continues beyond the // caller of doPrivileged. } }, acc, new FilePermission("/temp/*", read)); ...normal code here... }
传递限制
Permission
的一个实例的参数AllPermission
相当于调用等效doPrivileged
而不限制方法Permission
参数。 传递零长度数组Permission
将禁用代码权限,以便检查始终继续超出doPrivileged
方法的调用方。- 从以下版本开始:
- 1.2
- 另请参见:
-
AccessControlContext
-
-
方法摘要
所有方法 静态方法 具体的方法 变量和类型 方法 描述 static void
checkPermission(Permission perm)
根据当前的AccessControlContext和安全策略,确定是允许还是拒绝由指定权限指示的访问请求。static <T> T
doPrivileged(PrivilegedAction<T> action)
执行指定的PrivilegedAction
并启用权限。static <T> T
doPrivileged(PrivilegedAction<T> action, AccessControlContext context)
执行指定的PrivilegedAction
,其权限已启用并受指定的AccessControlContext
限制。static <T> T
doPrivileged(PrivilegedAction<T> action, AccessControlContext context, Permission... perms)
执行指定的PrivilegedAction
,其权限由指定的AccessControlContext
启用和限制,并且特权范围受指定的Permission
参数限制。static <T> T
doPrivileged(PrivilegedExceptionAction<T> action)
执行指定的PrivilegedExceptionAction
并启用权限。static <T> T
doPrivileged(PrivilegedExceptionAction<T> action, AccessControlContext context)
执行指定的PrivilegedExceptionAction
,其权限已启用并受指定的AccessControlContext
限制。static <T> T
doPrivileged(PrivilegedExceptionAction<T> action, AccessControlContext context, Permission... perms)
执行指定的PrivilegedExceptionAction
,其权限由指定的AccessControlContext
启用和限制,并且权限范围受指定的Permission
参数限制。static <T> T
doPrivilegedWithCombiner(PrivilegedAction<T> action)
执行指定的PrivilegedAction
并启用权限。static <T> T
doPrivilegedWithCombiner(PrivilegedAction<T> action, AccessControlContext context, Permission... perms)
执行指定的PrivilegedAction
,其权限由指定的AccessControlContext
启用和限制,并且权限范围受指定的Permission
参数限制。static <T> T
doPrivilegedWithCombiner(PrivilegedExceptionAction<T> action)
执行指定的PrivilegedExceptionAction
并启用权限。static <T> T
doPrivilegedWithCombiner(PrivilegedExceptionAction<T> action, AccessControlContext context, Permission... perms)
执行指定的PrivilegedExceptionAction
,其权限由指定的AccessControlContext
启用和限制,并且权限范围受指定的Permission
参数限制。static AccessControlContext
getContext()
此方法获取当前调用上下文的“快照”,其中包括当前Thread的继承AccessControlContext和任何有限的权限范围,并将其放在AccessControlContext对象中。
-
-
-
方法详细信息
-
doPrivileged
public static <T> T doPrivileged(PrivilegedAction<T> action)
执行指定的PrivilegedAction
并启用权限。 使用调用方保护域拥有的所有权限执行操作。如果操作的
run
方法抛出(未经检查的)异常,它将通过此方法传播。请注意,执行操作时将忽略与当前AccessControlContext关联的任何DomainCombiner。
- 参数类型
-
T
- PrivilegedAction的run
方法返回的值的类型。 - 参数
-
action
- 要执行的操作。 - 结果
-
动作的
run
方法返回的值。 - 异常
-
NullPointerException
- 如果操作是null
- 另请参见:
-
doPrivileged(PrivilegedAction,AccessControlContext)
,doPrivileged(PrivilegedExceptionAction)
,doPrivilegedWithCombiner(PrivilegedAction)
,DomainCombiner
-
doPrivilegedWithCombiner
public static <T> T doPrivilegedWithCombiner(PrivilegedAction<T> action)
执行指定的PrivilegedAction
并启用权限。 使用调用方保护域拥有的所有权限执行操作。如果操作的
run
方法抛出(未经检查的)异常,它将通过此方法传播。执行操作时,此方法保留当前的AccessControlContext的DomainCombiner(可能为null)。
- 参数类型
-
T
- PrivilegedAction的run
方法返回的值的类型。 - 参数
-
action
- 要执行的操作。 - 结果
-
动作的
run
方法返回的值。 - 异常
-
NullPointerException
- 如果操作是null
- 从以下版本开始:
- 1.6
- 另请参见:
-
doPrivileged(PrivilegedAction)
,DomainCombiner
-
doPrivileged
public static <T> T doPrivileged(PrivilegedAction<T> action, AccessControlContext context)
执行指定的PrivilegedAction
,其权限已启用并受指定的AccessControlContext
限制。 该操作是通过调用者保护域拥有的权限与指定的AccessControlContext
代表的域所拥有的权限的交集来执行的。如果操作的
run
方法抛出(未经检查的)异常,它将通过此方法传播。如果安装了安全管理器且指定的
AccessControlContext
未由系统代码创建,并且调用者的ProtectionDomain
未被授予“createAccessControlContext”SecurityPermission
,则执行该操作时无权限。- 参数类型
-
T
- PrivilegedAction的run
方法返回的值的类型。 - 参数
-
action
- 要执行的操作。 -
context
- 一个访问控制上下文,表示在执行指定操作之前要应用于调用方域的权限的限制。 如果上下文是null
,则不应用其他限制。 - 结果
-
动作的
run
方法返回的值。 - 异常
-
NullPointerException
- 如果操作是null
- 另请参见:
-
doPrivileged(PrivilegedAction)
,doPrivileged(PrivilegedExceptionAction,AccessControlContext)
-
doPrivileged
public static <T> T doPrivileged(PrivilegedAction<T> action, AccessControlContext context, Permission... perms)
执行指定的PrivilegedAction
,其权限由指定的AccessControlContext
启用和限制,并且权限范围受指定的Permission
参数限制。 该操作是使用调用者保护域拥有的权限与指定的AccessControlContext
代表的域所拥有的权限的交集来执行的。如果操作的
run
方法抛出(未经检查的)异常,它将通过此方法传播。如果安装了安全管理器
AccessControlContext
通过系统代码创建指定的AccessControlContext
并且未向调用者ProtectionDomain
授予“createAccessControlContext”SecurityPermission
,则执行该操作时无权限。- 参数类型
-
T
- PrivilegedAction的run
方法返回的值的类型。 - 参数
-
action
- 要执行的操作。 -
context
- 访问控制上下文,表示在执行指定操作之前要应用于调用方域的权限的限制。 如果上下文是null
,则不应用其他限制。 -
perms
- 限制调用者权限范围的Permission
参数。 参数的数量是可变的。 - 结果
-
动作的
run
方法返回的值。 - 异常
-
NullPointerException
- 如果action或perms或perms的任何元素是null
- 从以下版本开始:
- 1.8
- 另请参见:
-
doPrivileged(PrivilegedAction)
,doPrivileged(PrivilegedExceptionAction,AccessControlContext)
-
doPrivilegedWithCombiner
public static <T> T doPrivilegedWithCombiner(PrivilegedAction<T> action, AccessControlContext context, Permission... perms)
执行指定的PrivilegedAction
,其权限由指定的AccessControlContext
启用和限制,并且权限范围受指定的Permission
参数限制。 该操作是通过调用者保护域拥有的权限与指定的AccessControlContext
代表的域所拥有的权限的交集来执行的。如果操作的
run
方法抛出(未经检查的)异常,它将通过此方法传播。执行操作时,此方法保留当前的AccessControlContext的DomainCombiner(可能为null)。
如果安装了安全管理器且系统代码未创建指定的
AccessControlContext
且调用者的ProtectionDomain
未被授予“createAccessControlContext”SecurityPermission
,则执行操作时无权限。- 参数类型
-
T
- PrivilegedAction的run
方法返回的值的类型。 - 参数
-
action
- 要执行的操作。 -
context
- 访问控制上下文,表示在执行指定操作之前要应用于调用方域的权限的限制。 如果上下文是null
,则不应用其他限制。 -
perms
- 限制调用方权限范围的Permission
参数。 参数的数量是可变的。 - 结果
-
动作的
run
方法返回的值。 - 异常
-
NullPointerException
- 如果action或perms或perms的任何元素是null
- 从以下版本开始:
- 1.8
- 另请参见:
-
doPrivileged(PrivilegedAction)
,doPrivileged(PrivilegedExceptionAction,AccessControlContext)
,DomainCombiner
-
doPrivileged
public static <T> T doPrivileged(PrivilegedExceptionAction<T> action) throws PrivilegedActionException
执行指定的PrivilegedExceptionAction
并启用权限。 使用调用方保护域拥有的所有权限执行操作。如果操作的
run
方法抛出未经检查的异常,它将通过此方法传播。请注意,执行操作时将忽略与当前AccessControlContext关联的任何DomainCombiner。
- 参数类型
-
T
- PrivilegedExceptionAction的run
方法返回的值的类型。 - 参数
-
action
- 要执行的操作 - 结果
-
动作的
run
方法返回的值 - 异常
-
PrivilegedActionException
- 如果指定的操作的run
方法引发了已 检查的异常 -
NullPointerException
- 如果操作是null
- 另请参见:
-
doPrivileged(PrivilegedAction)
,doPrivileged(PrivilegedExceptionAction,AccessControlContext)
,doPrivilegedWithCombiner(PrivilegedExceptionAction)
,DomainCombiner
-
doPrivilegedWithCombiner
public static <T> T doPrivilegedWithCombiner(PrivilegedExceptionAction<T> action) throws PrivilegedActionException
执行指定的PrivilegedExceptionAction
并启用权限。 使用调用方保护域拥有的所有权限执行操作。如果操作的
run
方法抛出未经检查的异常,它将通过此方法传播。执行操作时,此方法保留当前的AccessControlContext的DomainCombiner(可能为null)。
- 参数类型
-
T
- PrivilegedExceptionAction的run
方法返回的值的类型。 - 参数
-
action
- 要执行的操作。 - 结果
-
动作的
run
方法返回的值 - 异常
-
PrivilegedActionException
- 如果指定的操作的run
方法抛出了已 检查的异常 -
NullPointerException
- 如果操作是null
- 从以下版本开始:
- 1.6
- 另请参见:
-
doPrivileged(PrivilegedAction)
,doPrivileged(PrivilegedExceptionAction,AccessControlContext)
,DomainCombiner
-
doPrivileged
public static <T> T doPrivileged(PrivilegedExceptionAction<T> action, AccessControlContext context) throws PrivilegedActionException
执行指定的PrivilegedExceptionAction
,其权限已启用并受指定的AccessControlContext
限制。 该操作是通过调用者保护域拥有的权限与指定的AccessControlContext
代表的域所拥有的权限的交集来执行的。如果操作的
run
方法抛出未经检查的异常,它将通过此方法传播。如果安装了安全管理器且系统代码未创建指定的
AccessControlContext
且调用者的ProtectionDomain
未被授予“createAccessControlContext”SecurityPermission
,则执行操作时无权限。- 参数类型
-
T
- PrivilegedExceptionAction的run
方法返回的值的类型。 - 参数
-
action
- 要执行的操作 -
context
- 一个访问控制上下文,表示在执行指定操作之前要应用于调用方域的权限的限制。 如果上下文是null
,则不应用其他限制。 - 结果
-
动作的
run
方法返回的值 - 异常
-
PrivilegedActionException
- 如果指定的操作run
方法抛出了已 检查的异常 -
NullPointerException
- 如果操作是null
- 另请参见:
-
doPrivileged(PrivilegedAction)
,doPrivileged(PrivilegedAction,AccessControlContext)
-
doPrivileged
public static <T> T doPrivileged(PrivilegedExceptionAction<T> action, AccessControlContext context, Permission... perms) throws PrivilegedActionException
执行指定的PrivilegedExceptionAction
,其权限由指定的AccessControlContext
启用和限制,并且权限范围受指定的Permission
参数限制。 该操作是使用调用者保护域所拥有的权限与指定的AccessControlContext
代表的域所拥有的权限的交集来执行的。如果操作的
run
方法抛出(未经检查的)异常,它将通过此方法传播。如果安装了安全管理器
AccessControlContext
通过系统代码创建指定的AccessControlContext
且调用者的ProtectionDomain
未被授予“createAccessControlContext”SecurityPermission
,则执行该操作时没有权限。- 参数类型
-
T
- PrivilegedExceptionAction的run
方法返回的值的类型。 - 参数
-
action
- 要执行的操作。 -
context
- 访问控制上下文,表示在执行指定操作之前应用于调用方域的权限的限制。 如果上下文是null
,则不应用其他限制。 -
perms
- 限制调用者权限范围的Permission
参数。 参数的数量是可变的。 - 结果
-
动作的
run
方法返回的值。 - 异常
-
PrivilegedActionException
- 如果指定的操作run
方法引发了已 检查的异常 -
NullPointerException
- 如果action或perms或perms的任何元素是null
- 从以下版本开始:
- 1.8
- 另请参见:
-
doPrivileged(PrivilegedAction)
,doPrivileged(PrivilegedAction,AccessControlContext)
-
doPrivilegedWithCombiner
public static <T> T doPrivilegedWithCombiner(PrivilegedExceptionAction<T> action, AccessControlContext context, Permission... perms) throws PrivilegedActionException
执行指定的PrivilegedExceptionAction
,其权限由指定的AccessControlContext
启用和限制,并且权限范围受指定的Permission
参数限制。 该操作使用呼叫者保护域拥有的权限与指定AccessControlContext
代表的域所拥有的权限的交集来执行。如果操作的
run
方法抛出(未经检查的)异常,它将通过此方法传播。执行操作时,此方法保留当前的AccessControlContext的DomainCombiner(可能为null)。
如果安装了安全管理和指定
AccessControlContext
不是由系统代码和调用者的创建ProtectionDomain
尚未被授予“createAccessControlContext”SecurityPermission
,则动作时没有权限执行。- 参数类型
-
T
- PrivilegedExceptionAction的run
方法返回的值的类型。 - 参数
-
action
- 要执行的操作。 -
context
- 访问控制上下文,表示在执行指定操作之前应用于调用方域的权限的限制。 如果上下文是null
,则不应用其他限制。 -
perms
- 限制调用方权限范围的Permission
参数。 参数的数量是可变的。 - 结果
-
动作的
run
方法返回的值。 - 异常
-
PrivilegedActionException
- 如果指定的操作的run
方法引发了已 检查的异常 -
NullPointerException
- 如果动作或烫发或烫发的任何元素是null
- 从以下版本开始:
- 1.8
- 另请参见:
-
doPrivileged(PrivilegedAction)
,doPrivileged(PrivilegedAction,AccessControlContext)
,DomainCombiner
-
getContext
public static AccessControlContext getContext()
此方法获取当前调用上下文的“快照”,其中包括当前Thread的继承AccessControlContext和任何有限的权限范围,并将其放在AccessControlContext对象中。 然后可以在稍后的点检查该上下文,可能在另一个线程中。- 结果
- AccessControlContext基于当前上下文。
- 另请参见:
-
AccessControlContext
-
checkPermission
public static void checkPermission(Permission perm) throws AccessControlException
根据当前的AccessControlContext和安全策略,确定是允许还是拒绝由指定权限指示的访问请求。 如果允许访问请求,则此方法将静默返回,否则抛出AccessControlException。 AccessControlException的getPermission方法返回perm
Permission对象实例。- 参数
-
perm
- 请求的权限。 - 异常
-
AccessControlException
- 如果不允许指定的权限,则根据当前的安全策略。 -
NullPointerException
- if the specified permission isnull
and is checked based on the security policy currently in effect.
-
-