public final class AccessController extends Object
的存取控制器类用于访问控制的运作和决策。
更具体地说,这是三用AccessController类:
的checkPermission方法确定是否访问请求通过指定权限表示应该授予或拒绝。下面出现一个示例调用。在这个例子中,checkPermission将决定是否批准“读”访问该文件命名为“个”中的“Temp”目录。
filepermission烫发=新filepermission(“/温度/测试文件”、“读”);AccessController checkPermission(烫);
如果一个请求的访问是允许的,checkPermission返回悄悄。如果拒绝,一个accesscontrolexception抛出。accesscontrolexception也可以如果请求是一个错误的类型或包含无效值扔。这样的信息,只要有可能。如果当前线程遍历M来电,来电者在1到2米然后调用调用者调用顺序的方法checkPermission M。的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制成,该PrivilegedAction实现的实例传递给它。的doPrivileged方法调用的实现方法后使run PrivilegedAction特权,作为doPrivileged返回值返回run方法的返回值(在这个例子忽略)。
如果你需要返回一个值,你可以做如下的事情:
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 = getcontext() AccessController。
accesscontrolcontext本身具有checkPermission方法进行访问的决定基于上下文它封装,而不是当前执行线程。在不同的上下文中的代码可以调用以前保存的accesscontrolcontext对象方法。一个示例调用如下:
acc.checkpermission(许可)
也有一些时候,你不知道先验的权限检查上下文对。在这些情况下你可以使用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方法的调用者。
AccessControlContext
| Modifier and Type | Method and Description |
|---|---|
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()
该方法以“快照”的当前上下文调用,包括当前线程的继承accesscontrolcontext和任何有限的权限范围,并把它放在一个accesscontrolcontext对象。
|
public static <T> T doPrivileged(PrivilegedAction<T> action)
PrivilegedAction权限启用。动作的权限全部的由调用者的保护领域具有。
如果行动的run方法抛出(没有)例外,它会通过这种方式传播。
值得注意的是,与目前的accesscontrolcontext相关的任何domaincombiner将同时执行的动作被忽略。
T -返回值的类型的方法的
run PrivilegedAction。
action -所要执行的操作。
run方法返回的值。
NullPointerException -如果动作是
null
doPrivileged(PrivilegedAction,AccessControlContext),
doPrivileged(PrivilegedExceptionAction),
doPrivilegedWithCombiner(PrivilegedAction),
DomainCombiner
public static <T> T doPrivilegedWithCombiner(PrivilegedAction<T> action)
PrivilegedAction权限启用。动作的权限全部的由调用者的保护领域具有。
如果行动的run方法抛出(没有)例外,它会通过这种方式传播。
该方法保留了当前accesscontrolcontext的domaincombiner(可能为空)而执行的动作。
T -返回值的类型的方法的
run PrivilegedAction。
action -所要执行的操作。
run方法返回的值。
NullPointerException -如果动作是
null
doPrivileged(PrivilegedAction),
DomainCombiner
public static <T> T doPrivileged(PrivilegedAction<T> action, AccessControlContext context)
PrivilegedAction启用并按指定
AccessControlContext限制特权。动作执行的权限的交集由调用者的保护域拥有,和那些被指定的
AccessControlContext代表拥有
如果行动的run方法抛出(没有)例外,它会通过这种方式传播。
如果安全管理器安装指定的AccessControlContext不是由系统创建的代码和调用方的ProtectionDomain没有被授予“createaccesscontrolcontext”SecurityPermission,那么这种行为是没有权限执行。
T -返回值的类型的方法的
run PrivilegedAction。
action -所要执行的操作。
context代表要执行指定的操作之前,应用到调用者的域的权限的限制上下文的访问控制。如果上下文是
null,然后没有附加限制的应用。
run方法返回的值。
NullPointerException -如果动作是
null
doPrivileged(PrivilegedAction),
doPrivileged(PrivilegedExceptionAction,AccessControlContext)
public static <T> T doPrivileged(PrivilegedAction<T> action, AccessControlContext context, Permission... perms)
PrivilegedAction启用并按指定
AccessControlContext和特权的范围有限
Permission参数指定限制特权。动作执行的权限的交集由调用者的保护域拥有,和那些被指定为代表的领域具有
AccessControlContext。
如果行动的run方法抛出(没有)例外,它会通过这种方式传播。
如果安全管理器安装指定的AccessControlContext不是由系统创建的代码和调用方的ProtectionDomain没有被授予“createaccesscontrolcontext”SecurityPermission,那么这种行为是没有权限执行。
run方法返回的值的类型
T。
action -所要执行的操作。
context代表要执行指定的操作之前,应用到调用者的域的权限的限制上下文的访问控制。如果上下文是
null,然后没有附加限制的应用。
perms -
Permission参数限制调用者的权限范围。参数的数目是可变的。
run方法返回的值。
NullPointerException如果行动或烫发或烫发的任何元素
null
doPrivileged(PrivilegedAction),
doPrivileged(PrivilegedExceptionAction,AccessControlContext)
public static <T> T doPrivilegedWithCombiner(PrivilegedAction<T> action, AccessControlContext context, Permission... perms)
PrivilegedAction启用并按指定
AccessControlContext和特权的范围有限
Permission参数指定限制特权。动作执行的权限的交集由调用者的保护域拥有,和那些被指定为代表的领域具有
AccessControlContext。
如果行动的run方法抛出(没有)例外,它会通过这种方式传播。
该方法保留了当前accesscontrolcontext的domaincombiner(可能为空)而执行的动作。
如果安全管理器安装指定的AccessControlContext不是由系统创建的代码和调用方的ProtectionDomain没有被授予“createaccesscontrolcontext”SecurityPermission,那么这种行为是没有权限执行。
T -返回值的类型的方法的
run PrivilegedAction。
action -所要执行的操作。
context代表要执行指定的操作之前,应用到调用者的域的权限的限制上下文的访问控制。如果上下文是
null,然后没有附加限制的应用。
perms -
Permission参数限制调用者的权限范围。参数的数目是可变的。
run方法返回的值。
NullPointerException如果行动或烫发或烫发的任何元素
null
doPrivileged(PrivilegedAction),
doPrivileged(PrivilegedExceptionAction,AccessControlContext),
DomainCombiner
public static <T> T doPrivileged(PrivilegedExceptionAction<T> action) throws PrivilegedActionException
PrivilegedExceptionAction权限启用。动作的权限全部的由调用者的保护领域具有。
如果行动的run方法抛出一个选中例外,它会通过这种方式传播。
值得注意的是,与目前的accesscontrolcontext相关的任何domaincombiner将同时执行的动作被忽略。
run方法返回的值的类型
T。
action -所要执行的操作
run方法返回的值
PrivilegedActionException -如果指定动作的
run方法抛出一个异常选中的
NullPointerException -如果动作是
null
doPrivileged(PrivilegedAction),
doPrivileged(PrivilegedExceptionAction,AccessControlContext),
doPrivilegedWithCombiner(PrivilegedExceptionAction),
DomainCombiner
public static <T> T doPrivilegedWithCombiner(PrivilegedExceptionAction<T> action) throws PrivilegedActionException
PrivilegedExceptionAction权限启用。动作的权限全部的由调用者的保护领域具有。
如果行动的run方法抛出一个选中例外,它会通过这种方式传播。
该方法保留了当前accesscontrolcontext的domaincombiner(可能为空)而执行的动作。
T -返回值的类型由privilegedexceptionaction的
run方法。
action -所要执行的操作。
run方法返回的值
PrivilegedActionException -如果指定动作的
run方法抛出一个异常选中的
NullPointerException -如果动作是
null
doPrivileged(PrivilegedAction),
doPrivileged(PrivilegedExceptionAction,AccessControlContext),
DomainCombiner
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)
public static <T> T doPrivileged(PrivilegedExceptionAction<T> action, AccessControlContext context, Permission... perms) throws PrivilegedActionException
PrivilegedExceptionAction启用并按指定
AccessControlContext和特权的范围有限
Permission参数指定限制特权。动作执行的权限的交集由调用者的保护域拥有,和那些被指定为代表的领域具有
AccessControlContext。
如果行动的run方法抛出(没有)例外,它会通过这种方式传播。
如果安全管理器安装指定的AccessControlContext不是由系统创建的代码和调用方的ProtectionDomain没有被授予“createaccesscontrolcontext”SecurityPermission,那么这种行为是没有权限执行。
run方法返回的值的类型
T。
action -所要执行的操作。
context代表要执行指定的操作之前,应用到调用者的域的权限的限制上下文的访问控制。如果上下文是
null,然后没有附加限制的应用。
perms -
Permission参数限制调用者的权限范围。参数的数目是可变的。
run方法返回的值。
PrivilegedActionException -如果指定动作的
run方法抛出一个异常选中的
NullPointerException如果行动或烫发或烫发的任何元素
null
doPrivileged(PrivilegedAction),
doPrivileged(PrivilegedAction,AccessControlContext)
public static <T> T doPrivilegedWithCombiner(PrivilegedExceptionAction<T> action, AccessControlContext context, Permission... perms) throws PrivilegedActionException
PrivilegedExceptionAction启用并按指定
AccessControlContext和特权的范围有限
Permission参数指定限制特权。动作执行的权限的交集由调用者的保护域拥有,和那些被指定为代表的领域具有
AccessControlContext。
如果行动的run方法抛出(没有)例外,它会通过这种方式传播。
该方法保留了当前accesscontrolcontext的domaincombiner(可能为空)而执行的动作。
如果安全管理器安装指定的AccessControlContext不是由系统创建的代码和调用方的ProtectionDomain没有被授予“createaccesscontrolcontext”SecurityPermission,那么这种行为是没有权限执行。
run方法返回的值的类型
T。
action -所要执行的操作。
context代表要执行指定的操作之前,应用到调用者的域的权限的限制上下文的访问控制。如果上下文是
null,然后没有附加限制的应用。
perms -
Permission参数限制调用者的权限范围。参数的数目是可变的。
run方法返回的值。
PrivilegedActionException -如果指定动作的
run方法抛出一个异常选中的
NullPointerException如果行动或烫发或烫发的任何元素
null
doPrivileged(PrivilegedAction),
doPrivileged(PrivilegedAction,AccessControlContext),
DomainCombiner
public static AccessControlContext getContext()
AccessControlContext
public static void checkPermission(Permission perm) throws AccessControlException
perm权限对象实例。
perm的请求。
AccessControlException -如果指定的权限是不允许的,基于目前的安全政策。
NullPointerException -如果指定的许可和检查
null基于安全政策目前的效果。
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.