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方法基于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呼叫到达被称为“特权”的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方法在启用权限后从doPrivileged实现调用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子句中列出的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方法的调用者。 
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() 
            
              此方法将获取当前调用上下文的“快照”,其中包括当前Thread的继承的AccessControlContext和任何有限权限范围,并将其放置在AccessControlContext对象中。 
               |  
          
public static <T> T doPrivileged(PrivilegedAction<T> action)
PrivilegedAction启用特权。 
           该操作是由呼叫者的保护域拥有的所有权限执行的。 
            如果action的run方法抛出一个(未经检查的)异常,它将通过此方法传播。 
请注意,执行操作时,将忽略与当前AccessControlContext关联的任何DomainCombiner。
T - PrivilegedAction的 
            run方法返回的值的类型。 
           action - 要执行的动作。 
           run方法。 
           NullPointerException - 如果操作是 
            null 
           doPrivileged(PrivilegedAction,AccessControlContext) , doPrivileged(PrivilegedExceptionAction) , doPrivilegedWithCombiner(PrivilegedAction) , DomainCombiner 
           public static <T> T doPrivilegedWithCombiner(PrivilegedAction<T> action)
PrivilegedAction启用特权。 
           该操作是由呼叫者的保护域拥有的所有权限执行的。 
            如果action的run方法抛出一个(未经检查的)异常,它将通过此方法传播。 
该方法在执行操作时保留当前的AccessControlContext的DomainCombiner(可能为null)。
T - 由PrivilegedAction的 
            run方法返回的值的类型。 
           action - 要执行的动作。 
           run方法。 
           NullPointerException - 如果动作是 
            null 
           doPrivileged(PrivilegedAction) , DomainCombiner 
           public static <T> T doPrivileged(PrivilegedAction<T> action, AccessControlContext context)
PrivilegedAction由指定的启用和限制特权AccessControlContext 。 
           该操作是由呼叫者的保护域拥有的权限和由指定的AccessControlContext所表示的域拥有的权限进行AccessControlContext 。 
            如果action的run方法抛出一个(未经检查的)异常,它将通过此方法传播。 
 如果安装了一个安全管理器,并且系统代码未创建指定的AccessControlContext ,并且调用方的ProtectionDomain尚未被授予“createAccessControlContext” SecurityPermission ,那么该操作将在没有权限的情况下执行。 
T - PrivilegedAction的 
            run方法返回的值的类型。 
           action - 要执行的动作。 
           context - 表示在执行指定操作之前应用于调用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 AccessControlContext的域拥有的权限AccessControlContext 。 
            如果action的run方法抛出一个(未经检查的)异常,它将通过此方法传播。 
 如果安装了一个安全管理器,并且系统代码没有创建指定的AccessControlContext ,并且调用方的ProtectionDomain尚未被授予“createAccessControlContext” SecurityPermission ,那么该操作将在没有权限的情况下执行。 
T - PrivilegedAction的 
            run方法返回的值的类型。 
           action - 要执行的动作。 
           context - 表示在执行指定操作之前应用于调用context的权限的限制的访问控制上下文 。 
            如果上下文为null ,则不再应用其他限制。 
           perms -在Permission论点限制调用者的权限范围。 
            参数的数量是可变的。 
           run方法。 
           NullPointerException - 如果动作或perms或任何perms元素是 
            null 
           doPrivileged(PrivilegedAction) , 
            doPrivileged(PrivilegedExceptionAction,AccessControlContext) 
           public static <T> T doPrivilegedWithCombiner(PrivilegedAction<T> action, AccessControlContext context, Permission... perms)
PrivilegedAction由指定的启用和限制特权, AccessControlContext ,并通过指定所限制的特权范围Permission参数。 
           该行为是由呼叫者的保护域拥有的权限和由指定的AccessControlContext所表示的域所拥有的权限进行AccessControlContext 。 
            如果action的run方法抛出一个(未经检查的)异常,它将通过此方法传播。 
该方法在执行操作时保留当前的AccessControlContext的DomainCombiner(可能为null)。
 如果安装了一个安全管理器,并且系统代码未创建指定的AccessControlContext ,并且调用方的ProtectionDomain尚未被授予“createAccessControlContext” SecurityPermission ,那么该操作将在没有权限的情况下执行。 
T - PrivilegedAction的 
            run方法返回的值的类型。 
           action - 要执行的动作。 
           context - 表示在执行指定操作之前应用于调用context的权限的限制的访问控制上下文 。 
            如果上下文为null ,则不再应用其他限制。 
           perms -在Permission论点限制调用者的权限范围。 
            参数的数量是可变的。 
           run方法。 
           NullPointerException - 如果动作或perms或任何perms元素是 
            null 
           doPrivileged(PrivilegedAction) , doPrivileged(PrivilegedExceptionAction,AccessControlContext) , DomainCombiner 
           public static <T> T doPrivileged(PrivilegedExceptionAction<T> action) throws PrivilegedActionException
PrivilegedExceptionAction启用特权。 
           该操作是由呼叫者的保护域拥有的所有权限执行的。 
            如果action的run方法抛出未经检查的异常,它将通过此方法传播。 
请注意,执行操作时,将忽略与当前AccessControlContext关联的任何DomainCombiner。
T - PrivilegedExceptionAction的 
            run方法返回的值的类型。 
           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(可能为null)。
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所表示的域所拥有的AccessControlContext 。 
            如果action的run方法抛出未经检查的异常,它将通过此方法传播。 
 如果安装了一个安全管理器,并且系统代码未创建指定的AccessControlContext ,并且调用方的ProtectionDomain尚未被授予“createAccessControlContext” SecurityPermission ,那么该操作将在没有权限的情况下执行。 
T - 由PrivilegedExceptionAction的 
            run方法返回的值的类型。 
           action - 要执行的动作 
           context - 表示在执行指定操作之前应用于调用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所表示的域拥有的权限AccessControlContext 。 
            如果action的run方法抛出一个(未经检查的)异常,它将通过此方法传播。 
 如果安装了一个安全管理器,并且系统代码未创建指定的AccessControlContext ,并且调用方的ProtectionDomain尚未被授予“createAccessControlContext” SecurityPermission ,那么该操作将在没有权限的情况下执行。 
T - 由PrivilegedExceptionAction的 
            run方法返回的值的类型。 
           action - 要执行的动作。 
           context - 表示在执行指定操作之前应用于调用context的权限的限制的访问控制上下文 。 
            如果上下文是null ,则不再应用其他限制。 
           perms -在Permission论点限制调用者的权限范围。 
            参数的数量是可变的。 
           run方法。 
           PrivilegedActionException - 如果指定的动作的 
            run方法抛出一个 
            被检查的异常 
           NullPointerException - 如果动作或perms或任何perms元素是 
            null 
           doPrivileged(PrivilegedAction) , 
            doPrivileged(PrivilegedAction,AccessControlContext) 
           public static <T> T doPrivilegedWithCombiner(PrivilegedExceptionAction<T> action, AccessControlContext context, Permission... perms) throws PrivilegedActionException
PrivilegedExceptionAction由指定的启用和限制特权, AccessControlContext ,并通过指定所限制的特权范围Permission参数。 
           该操作是由呼叫者的保护域所拥有的权限与由指定的AccessControlContext AccessControlContext的域拥有的权限进行AccessControlContext 。 
            如果action的run方法抛出一个(未经检查的)异常,它将通过此方法传播。 
该方法在执行操作时保留当前的AccessControlContext的DomainCombiner(可能为null)。
 如果安装了一个安全管理器,并且指定的AccessControlContext未由系统代码创建,并且调用方的ProtectionDomain尚未被授予“createAccessControlContext” SecurityPermission ,那么该操作将在没有权限的情况下执行。 
T - PrivilegedExceptionAction的 
            run方法返回的值的类型。 
           action - 要执行的动作。 
           context - 表示在执行指定操作之前应用于调用context的权限的限制的访问控制上下文 。 
            如果上下文为null ,则不再应用其他限制。 
           perms -在Permission论点限制调用者的权限范围。 
            参数的数量是可变的。 
           run方法。 
           PrivilegedActionException - 如果指定的动作的 
            run方法抛出一个 
            被检查的异常 
           NullPointerException - 如果动作或perms或任何perms元素是 
            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.