JavaTM Platform
Standard Ed. 6

java.security
类 AccessController

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。只要有可能,都会给出此类信息。假定当前线程按照调用方 1 到调用方 2 直到调用方 m 的顺序遍历了 m 个调用方。那么调用方 m 调用 checkPermission 方法。checkPermission 方法基于以下算法确定是批准还是拒绝进行访问:

 i = m;
 
 while (i > 0) {
 
      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)
return;
      }
      i = i - 1;
 };

    // 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 及下文)。在做访问控制决定时,如果遇到通过调用不带上下文参数(请参阅下文,以获取关于上下文参数的信息)的 doPrivileged 标记为“特权”的调用方,则 checkPermission 方法将停止检查。如果该调用方的域具有指定的权限,则不进行进一步检查,并且 checkPermission 正常返回,指示允许所请求的访问。如果该域不具有指定的权限,则通常抛出异常。

“特权”功能的标准用法如下所示。如果不需要从“特权”块返回值,则使用以下代码:

   somemethod() {
        ...normal code here...
        AccessController.doPrivileged(new PrivilegedAction() {
            public Object run() {
                // privileged code goes here, for example:
                System.loadLibrary("awt");
                return null; // nothing to return
            }
        });
       ...normal code here...
  }
 

PrivilegedAction 是一个具有单个方法的接口,该方法名为 run 并返回一个 Object。上述示例显示该接口的实现的创建;提供了 run 方法的具体实现。调用 doPrivileged 时,将 PrivilegedAction 实现的实例传递给它。doPrivileged 方法在启用特权后从 PrivilegedAction 实现调用 run 方法,并返回 run 方法的返回值作为 doPrivileged 的返回值(在此示例中忽略)。

如果需要返回值,则可使用以下代码:

   somemethod() {
        ...normal code here...
        String user = (String) AccessController.doPrivileged(
          new PrivilegedAction() {
            public Object run() {
                return System.getProperty("user.name");
            }
          }
        );
        ...normal code here...
  }
 

如果在 run 方法中执行的操作可以抛出“已经过检查”异常(列在方法的 throws 子句中),则需要使用 PrivilegedExceptionAction 接口代替 PrivilegedAction 接口:

   somemethod() throws FileNotFoundException {
        ...normal code here...
      try {
        FileInputStream fis = (FileInputStream) AccessController.doPrivileged(
          new PrivilegedExceptionAction() {
            public Object 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...
  }
 

在使用“特权”构造时务必 * 特别 * 小心,始终让享有特权的代码段尽可能的小。

注意,checkPermission 始终在当前执行线程的上下文中执行安全性检查。有时,本来应该在给定上下文中进行的安全性检查实际需要在另一个 上下文中(例如,在 worker 线程中)完成。getContext 方法和 AccessControlContext 类就是为这种情况提供的。getContext 方法获取当前调用上下文的“快照”,并将其置于它所返回的 AccessControlContext 对象中。示例调用如下:

 
   AccessControlContext acc = AccessController.getContext()
 
 

AccessControlContext 本身具有一个 checkPermission 方法,该方法基于 所封装的上下文而不是当前执行线程作出访问决定。因此,另一上下文中的代码可以在以前保存的 AccessControlContext 对象上调用该方法。示例调用如下:

 
   acc.checkPermission(permission)
 
 

有时候您可能不知道用于检查上下文的权限的优先级。这时可以使用 doPrivileged 方法获取上下文:

   somemethod() {
         AccessController.doPrivileged(new PrivilegedAction() {
              public Object run() {
                 // Code goes here. Any permission checks within this
                 // run method will require that the intersection of the
                 // callers protection domain and the snapshot's
                 // context have the desired permission.
              }
         }, acc);
         ...normal code here...
   }
 

另请参见:
AccessControlContext

方法摘要
static void checkPermission(Permission perm)
          基于当前 AccessControlContext 和安全策略确定是否允许指定权限所指示的访问请求。
static
<T> T
doPrivileged(PrivilegedAction<T> action)
          启用特权,执行指定的 PrivilegedAction
static
<T> T
doPrivileged(PrivilegedAction<T> action, AccessControlContext context)
          通过指定的 AccessControlContext 启用和限制特权,执行指定的 PrivilegedAction
static
<T> T
doPrivileged(PrivilegedExceptionAction<T> action)
          启用特权,执行指定的 PrivilegedExceptionAction
static
<T> T
doPrivileged(PrivilegedExceptionAction<T> action, AccessControlContext context)
          通过指定的 AccessControlContext 启用和限制特权,执行指定的 PrivilegedExceptionAction
static
<T> T
doPrivilegedWithCombiner(PrivilegedAction<T> action)
          启用特权,执行指定的 PrivilegedAction
static
<T> T
doPrivilegedWithCombiner(PrivilegedExceptionAction<T> action)
          启用特权,执行指定的 PrivilegedExceptionAction
static AccessControlContext getContext()
          此方法获取当前调用上下文(包括当前 Thread 的继承 AccessControlContext)的“快照”,并将其置于 AccessControlContext 对象中。
 
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

方法详细信息

doPrivileged

public static <T> T doPrivileged(PrivilegedAction<T> action)
启用特权,执行指定的 PrivilegedAction。该操作在调用者保护域所拥有的 全部 权限下执行。

如果该操作的 run 方法抛出(未经过检查的)异常,则该异常将通过此方法传播。

注意,执行该操作时,任何与当前 AccessControlContext 关联的 DomainCombiner 都将被忽略。

参数:
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)。

参数:
action - 要执行的操作。
返回:
操作的 run 方法返回的值。
抛出:
NullPointerException - 如果 action 为 null
从以下版本开始:
1.6
另请参见:
doPrivileged(PrivilegedAction), DomainCombiner

doPrivileged

public static <T> T doPrivileged(PrivilegedAction<T> action,
                                 AccessControlContext context)
通过指定的 AccessControlContext 启用和限制特权,执行指定的 PrivilegedAction。该操作在调用方保护域所拥有权限与指定的 AccessControlContext 表示的域所拥有权限的交集下执行。

如果该操作的 run 方法抛出(未经过检查的)异常,则该异常将通过此方法传播。

参数:
action - 要执行的操作。
context - 访问控制上下文,表示执行指定操作前应用于调用方的域特权的限制条件。如果上下文为 null,则不应用任何附加限制。
返回:
操作的 run 方法返回的值。
抛出:
NullPointerException - 如果该操作为 null
另请参见:
doPrivileged(PrivilegedAction), doPrivileged(PrivilegedExceptionAction,AccessControlContext)

doPrivileged

public static <T> T doPrivileged(PrivilegedExceptionAction<T> action)
                      throws PrivilegedActionException
启用特权,执行指定的 PrivilegedExceptionAction。该操作在调用方保护域所拥有的 全部 权限下执行。

如果该操作的 run 方法抛出未经过检查的 异常,则该异常将通过此方法传播。

注意,执行操作时任何与当前 AccessControlContext 关联的 DomainCombiner 都将被忽略。

参数:
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)。

参数:
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
通过指定的 AccessControlContext 启用和限制特权,执行指定的 PrivilegedExceptionAction。操作在调用方保护域所拥有权限与指定的 AccessControlContext 表示的域所拥有权限的交集下执行。

如果该操作的 run 方法抛出未经过检查的 异常,则该异常将通过此方法传播。

参数:
action - 要执行的操作
context - 访问控制上下文,表示执行指定操作前应用于调用方的域特权的限制条件。如果上下文为 null,则不应用任何附加限制。
返回:
操作的 run 方法返回的值
抛出:
PrivilegedActionException - 如果指定操作的 run 方法抛出 未经过检查的 异常
NullPointerException - 如果操作为 null
另请参见:
doPrivileged(PrivilegedAction), doPrivileged(PrivilegedExceptionAction,AccessControlContext)

getContext

public static AccessControlContext getContext()
此方法获取当前调用上下文(包括当前 Thread 的继承 AccessControlContext)的“快照”,并将其置于 AccessControlContext 对象中。稍后可能在另一个线程中对此上下文进行检查。

返回:
基于当前上下文的 AccessControlContext。
另请参见:
AccessControlContext

checkPermission

public static void checkPermission(Permission perm)
                            throws AccessControlException
基于当前 AccessControlContext 和安全策略确定是否允许指定权限所指示的访问请求。如果允许访问请求,此方法正常返回;否则抛出适当的 AccessControlException。

参数:
perm - 请求的权限。
抛出:
AccessControlException - 如果根据当前的安全策略不允许使用指定的权限。
NullPointerException - 如果指定权限为 null 并且基于当前生效的安全策略进行了检查。

JavaTM Platform
Standard Ed. 6

提交错误或意见
有关更多的 API 参考资料和开发人员文档,请参阅 Java SE 开发人员文档。该文档包含更详细的、面向开发人员的描述,以及总体概述、术语定义、使用技巧和工作代码示例。

版权所有 2007 Sun Microsystems, Inc. 保留所有权利。 请遵守许可证条款。另请参阅文档重新分发政策