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.