Module java.base
Package java.security

Class AccessController

java.lang.Object
java.security.AccessController

@Deprecated(since="17", forRemoval=true) public final class AccessController extends Object
Deprecated, for removal: This API element is subject to removal in a future version.
This class is only useful in conjunction with the Security Manager, which is deprecated and subject to removal in a future release. Consequently, this class is also deprecated and subject to removal. There is no replacement for the Security Manager or this class.

AccessController类用于访问控制操作和决策。

更具体地说,AccessController类用于三个目的:

  • 根据当前生效的安全策略决定是否允许或拒绝对关键系统资源的访问,
  • 将代码标记为“特权”,从而影响后续的访问决策,以及
  • 获取当前调用上下文的“快照”,以便可以基于保存的上下文对来自不同上下文的访问控制决策进行。

checkPermission方法确定指定权限所指示的访问请求是否应该被授予或拒绝。下面是一个示例调用。在这个例子中,checkPermission将确定是否授予对“/temp”目录中名为“testFile”的文件的“读取”访问权限。

 FilePermission perm = new FilePermission("/temp/testFile", "read");
 AccessController.checkPermission(perm);

 

如果允许请求的访问,checkPermission会安静地返回。如果被拒绝,将抛出一个AccessControlException。如果请求的权限类型不正确或包含无效值,也会抛出AccessControlException。尽可能提供此类信息。假设当前线程遍历了m个调用者,按照调用者1到调用者m的顺序。然后调用者m调用了checkPermission方法。checkPermission方法根据以下算法确定是否授予或拒绝访问:

 
 for (int i = m; i > 0; i--) {

     if (调用者i的域没有该权限)
         抛出AccessControlException

     else if (调用者i被标记为特权) {
         if (在调用doPrivileged时指定了上下文)
             context.checkPermission(permission)
         if (在调用doPrivileged时指定了有限权限) {
             for (每个有限权限) {
                 if (有限权限包含请求的权限)
                     返回;
             }
         } else
             返回;
     }
 }

 // 接下来,检查线程创建时继承的上下文。
 // 每当创建新线程时,那时的AccessControlContext被存储并与新线程关联,作为“继承”上下文。

 inheritedContext.checkPermission(permission);
 

调用者可以被标记为“特权”(参见doPrivileged(java.security.PrivilegedAction)及以下)。在进行访问控制决策时,如果到达了通过doPrivileged调用而被标记为“特权”的调用者,且该调用者的域具有指定权限,并且至少一个限制权限参数(如果有的话)包含请求的权限,则checkPermission停止检查,并安静地返回,表示允许请求的访问。如果该域没有指定权限,则会抛出异常,如常规情况。如果调用者的域具有指定权限,但在调用doPrivileged时没有任何限制权限参数暗示请求的权限,则权限检查将继续,直到没有更多的调用者或另一个doPrivileged调用匹配请求的权限并正常返回。

“特权”功能的正常使用如下。如果您不需要在“特权”块内返回值,请执行以下操作:

 
 somemethod() {
     ...这里是正常代码...
     AccessController.doPrivileged(new PrivilegedAction<Void>() {
         public Void run() {
             // 特权代码在这里,例如:
             System.loadLibrary("awt");
             return null; // 没有返回值
         }
     });
     ...这里是正常代码...
 }

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

如果需要返回一个值,可以执行以下操作:

 
 somemethod() {
     ...这里是正常代码...
     String user = AccessController.doPrivileged(
         new PrivilegedAction<String>() {
         public String run() {
             return System.getProperty("user.name");
             }
         });
     ...这里是正常代码...
 }

如果您的run方法中执行的操作可能引发“已检查”异常(列在方法的throws子句中),那么您需要使用PrivilegedExceptionAction接口而不是PrivilegedAction接口:

 
 somemethod() throws FileNotFoundException {
     ...这里是正常代码...
     try {
         FileInputStream fis = AccessController.doPrivileged(
         new PrivilegedExceptionAction<FileInputStream>() {
             public FileInputStream run() throws FileNotFoundException {
                 return new FileInputStream("someFile");
             }
         });
     } catch (PrivilegedActionException e) {
         // e.getException()应该是FileNotFoundException的一个实例,
         // 因为只有“已检查”异常会被“包装”在PrivilegedActionException中。
         throw (FileNotFoundException) e.getException();
     }
     ...这里是正常代码...
  }

在使用“特权”构造时要非常小心,并始终记住将特权代码段尽可能缩小。您可以传递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() {
             // 代码在这里。在这个run方法中的任何权限检查都将要求调用者的保护域和快照的上下文的交集具有所需的权限。如果请求的权限不被限制的FilePermission参数暗示,则检查线程将继续超出doPrivileged的调用者。
         }
     }, acc, new FilePermission("/temp/*", read));
     ...这里是正常代码...
 }

传递一个AllPermission实例的限制Permission参数等效于调用相应的不带限制Permission参数的doPrivileged方法。传递一个长度为零的Permission数组会禁用代码特权,以便检查总是继续超出该doPrivileged方法的调用者。

自版本:
1.2
参见:
  • Method Summary

    Modifier and Type
    Method
    Description
    static void
    已弃用,将被移除:此API元素可能在将来的版本中被移除。
    确定是否应允许或拒绝由指定权限指示的访问请求,基于当前的AccessControlContext和安全策略。
    static <T> T
    已弃用,将被移除:此API元素可能在将来的版本中被移除。
    启用权限执行指定的PrivilegedAction
    static <T> T
    已弃用,将被移除:此API元素可能在将来的版本中被移除。
    启用权限执行指定的PrivilegedAction,并受指定的AccessControlContext限制。
    static <T> T
    已弃用,将被移除:此API元素可能在将来的版本中被移除。
    启用权限执行指定的PrivilegedAction,并受指定的AccessControlContext限制,以及通过指定的Permission参数限制特权范围。
    static <T> T
    已弃用,将被移除:此API元素可能在将来的版本中被移除。
    启用权限执行指定的PrivilegedExceptionAction
    static <T> T
    已弃用,将被移除:此API元素可能在将来的版本中被移除。
    启用权限执行指定的PrivilegedExceptionAction,并受指定的AccessControlContext限制。
    static <T> T
    已弃用,将被移除:此API元素可能在将来的版本中被移除。
    启用权限执行指定的PrivilegedExceptionAction,并受指定的AccessControlContext限制,以及通过指定的Permission参数限制特权范围。
    static <T> T
    已弃用,将被移除:此API元素可能在将来的版本中被移除。
    执行指定的PrivilegedAction,启用权限。
    static <T> T
    已弃用,将被移除:此API元素可能在将来的版本中被移除。
    执行指定的PrivilegedAction,启用权限,并由指定的AccessControlContext限制,并通过指定的Permission参数限制特权范围。
    static <T> T
    已弃用,将被移除:此API元素可能在将来的版本中被移除。
    执行指定的PrivilegedExceptionAction,启用权限。
    static <T> T
    已弃用,将被移除:此API元素可能在将来的版本中被移除。
    执行指定的PrivilegedExceptionAction,启用权限,并由指定的AccessControlContext限制,并通过指定的Permission参数限制特权范围。
    已弃用,将被移除:此API元素可能在将来的版本中被移除。
    此方法获取当前调用上下文的“快照”,其中包括当前线程继承的AccessControlContext和任何有限的特权范围,并将其放置在一个AccessControlContext对象中。

    Methods declared in class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Method Details

    • doPrivileged

      public static <T> T doPrivileged(PrivilegedAction<T> action)
      Deprecated, for removal: This API element is subject to removal in a future version.
      执行指定的PrivilegedAction,启用权限。该操作使用调用者保护域拥有的所有权限执行。

      如果操作的run方法引发(未检查的)异常,它将通过此方法传播。

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

      类型参数:
      T - 由PrivilegedAction的run方法返回的值的类型。
      参数:
      action - 要执行的操作。
      返回:
      操作的run方法返回的值。
      抛出:
      NullPointerException - 如果操作为null
      参见:
    • doPrivilegedWithCombiner

      public static <T> T doPrivilegedWithCombiner(PrivilegedAction<T> action)
      Deprecated, for removal: This API element is subject to removal in a future version.
      执行指定的PrivilegedAction,启用权限。该操作使用调用者保护域拥有的所有权限执行。

      如果操作的run方法引发(未检查的)异常,它将通过此方法传播。

      在执行操作时,此方法保留当前AccessControlContext的DomainCombiner(可能为null)。

      类型参数:
      T - 由PrivilegedAction的run方法返回的值的类型。
      参数:
      action - 要执行的操作。
      返回:
      操作的run方法返回的值。
      抛出:
      NullPointerException - 如果操作为null
      自Java版本:
      1.6
      参见:
    • doPrivileged

      public static <T> T doPrivileged(PrivilegedAction<T> action, AccessControlContext context)
      Deprecated, for removal: This API element is subject to removal in a future version.
      执行指定的PrivilegedAction,启用权限,并由指定的AccessControlContext限制。该操作使用调用者保护域拥有的权限与指定的AccessControlContext所代表的域拥有的权限的交集执行。

      如果操作的run方法引发(未检查的)异常,它将通过此方法传播。

      如果安装了安全管理器,并且指定的AccessControlContext不是由系统代码创建,并且调用者的ProtectionDomain未被授予“createAccessControlContext”SecurityPermission,则操作将不具备任何权限。

      类型参数:
      T - 由PrivilegedAction的run方法返回的值的类型。
      参数:
      action - 要执行的操作。
      context -表示要在执行指定操作之前应用于调用者域权限的限制的访问控制上下文。如果上下文为null,则不会应用任何额外限制。
      返回:
      操作的run方法返回的值。
      抛出:
      NullPointerException - 如果操作为null
      参见:
    • doPrivileged

      public static <T> T doPrivileged(PrivilegedAction<T> action, AccessControlContext context, Permission... perms)
      Deprecated, for removal: This API element is subject to removal in a future version.
      Performs the specified PrivilegedAction with privileges enabled and restricted by the specified AccessControlContext and with a privilege scope limited by specified Permission arguments. The action is performed with the intersection of the permissions possessed by the caller's protection domain, and those possessed by the domains represented by the specified AccessControlContext.

      If the action's run method throws an (unchecked) exception, it will propagate through this method.

      If a security manager is installed and the specified AccessControlContext was not created by system code and the caller's ProtectionDomain has not been granted the "createAccessControlContext" SecurityPermission, then the action is performed with no permissions.

      Type Parameters:
      T - the type of the value returned by the PrivilegedAction's run method.
      Parameters:
      action - the action to be performed.
      context - an access control context representing the restriction to be applied to the caller's domain's privileges before performing the specified action. If the context is null, then no additional restriction is applied.
      perms - the Permission arguments which limit the scope of the caller's privileges. The number of arguments is variable.
      Returns:
      the value returned by the action's run method.
      Throws:
      NullPointerException - if action or perms or any element of perms is null
      Since:
      1.8
      See Also:
    • doPrivilegedWithCombiner

      public static <T> T doPrivilegedWithCombiner(PrivilegedAction<T> action, AccessControlContext context, Permission... perms)
      Deprecated, for removal: This API element is subject to removal in a future version.
      Performs the specified PrivilegedAction with privileges enabled and restricted by the specified AccessControlContext and with a privilege scope limited by specified Permission arguments. The action is performed with the intersection of the permissions possessed by the caller's protection domain, and those possessed by the domains represented by the specified AccessControlContext.

      If the action's run method throws an (unchecked) exception, it will propagate through this method.

      This method preserves the current AccessControlContext's DomainCombiner (which may be null) while the action is performed.

      If a security manager is installed and the specified AccessControlContext was not created by system code and the caller's ProtectionDomain has not been granted the "createAccessControlContext" SecurityPermission, then the action is performed with no permissions.

      Type Parameters:
      T - the type of the value returned by the PrivilegedAction's run method.
      Parameters:
      action - the action to be performed.
      context - an access control context representing the restriction to be applied to the caller's domain's privileges before performing the specified action. If the context is null, then no additional restriction is applied.
      perms - the Permission arguments which limit the scope of the caller's privileges. The number of arguments is variable.
      Returns:
      the value returned by the action's run method.
      Throws:
      NullPointerException - if action or perms or any element of perms is null
      Since:
      1.8
      See Also:
    • doPrivileged

      public static <T> T doPrivileged(PrivilegedExceptionAction<T> action) throws PrivilegedActionException
      Deprecated, for removal: This API element is subject to removal in a future version.
      执行指定的PrivilegedExceptionAction,启用权限。该操作将使用调用者保护域拥有的所有权限执行。

      如果操作的run方法抛出一个未检查的异常,它将通过此方法传播。

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

      类型参数:
      T - PrivilegedExceptionAction的run方法返回的值的类型。
      参数:
      action - 要执行的操作
      返回:
      操作的run方法返回的值
      抛出:
      PrivilegedActionException - 如果指定的操作的run方法抛出一个已检查的异常
      NullPointerException - 如果操作为null
      参见:
    • doPrivilegedWithCombiner

      public static <T> T doPrivilegedWithCombiner(PrivilegedExceptionAction<T> action) throws PrivilegedActionException
      Deprecated, for removal: This API element is subject to removal in a future version.
      执行指定的PrivilegedExceptionAction,启用权限。该操作将使用调用者保护域拥有的所有权限执行。

      如果操作的run方法抛出一个未检查的异常,它将通过此方法传播。

      在执行操作时,此方法保留当前AccessControlContextDomainCombiner(可能为null)。

      类型参数:
      T - PrivilegedExceptionAction的run方法返回的值的类型。
      参数:
      action - 要执行的操作。
      返回:
      操作的run方法返回的值
      抛出:
      PrivilegedActionException - 如果指定的操作的run方法抛出一个已检查的异常
      NullPointerException - 如果操作为null
      自Java版本:
      1.6
      参见:
    • doPrivileged

      public static <T> T doPrivileged(PrivilegedExceptionAction<T> action, AccessControlContext context) throws PrivilegedActionException
      Deprecated, for removal: This API element is subject to removal in a future version.
      执行指定的PrivilegedExceptionAction,启用权限,并由指定的AccessControlContext限制。该操作将使用调用者保护域拥有的权限与指定AccessControlContext所代表的域拥有的权限的交集执行。

      如果操作的run方法抛出一个未检查的异常,它将通过此方法传播。

      如果安装了安全管理器,并且指定的AccessControlContext不是由系统代码创建的,且调用者的ProtectionDomain未被授予"createAccessControlContext" SecurityPermission,则操作将不具备任何权限。

      类型参数:
      T - PrivilegedExceptionAction的run方法返回的值的类型。
      参数:
      action - 要执行的操作
      context - 表示在执行指定操作之前应用于调用者域权限的限制的访问控制上下文。如果上下文为null,则不会应用任何额外限制。
      返回:
      操作的run方法返回的值
      抛出:
      PrivilegedActionException - 如果指定的操作的run方法抛出一个已检查的异常
      NullPointerException - 如果操作为null
      参见:
    • doPrivileged

      public static <T> T doPrivileged(PrivilegedExceptionAction<T> action, AccessControlContext context, Permission... perms) throws PrivilegedActionException
      Deprecated, for removal: This API element is subject to removal in a future version.
      执行指定的PrivilegedExceptionAction,启用权限,并由指定的AccessControlContext限制,并且由指定的Permission参数限制特权范围。该操作将使用调用者保护域拥有的权限与指定AccessControlContext所代表的域拥有的权限的交集执行。

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

      如果安装了安全管理器,并且指定的AccessControlContext不是由系统代码创建的,且调用者的ProtectionDomain未被授予"createAccessControlContext" SecurityPermission,则操作将不具备任何权限。

      类型参数:
      T - PrivilegedExceptionAction的run方法返回的值的类型。
      参数:
      action - 要执行的操作。
      context - 表示在执行指定操作之前应用于调用者域权限的限制的访问控制上下文。如果上下文为null,则不会应用任何额外限制。
      perms - 限制调用者权限范围的Permission参数。参数数量可变。
      返回:
      操作的run方法返回的值。
      抛出:
      PrivilegedActionException - 如果指定的操作的run方法抛出一个已检查的异常
      NullPointerException - 如果操作或perms或perms的任何元素为null
      自Java版本:
      1.8
      参见:
    • doPrivilegedWithCombiner

      public static <T> T doPrivilegedWithCombiner(PrivilegedExceptionAction<T> action, AccessControlContext context, Permission... perms) throws PrivilegedActionException
      Deprecated, for removal: This API element is subject to removal in a future version.
      执行指定的PrivilegedExceptionAction,启用权限,并由指定的AccessControlContext限制,并且由指定的Permission参数限制特权范围。该操作将使用调用者保护域拥有的权限与指定AccessControlContext所代表的域拥有的权限的交集执行。

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

      在执行操作时,此方法保留当前AccessControlContextDomainCombiner(可能为null)。

      如果安装了安全管理器,并且指定的AccessControlContext不是由系统代码创建的,且调用者的ProtectionDomain未被授予"createAccessControlContext" SecurityPermission,则操作将不具备任何权限。

      类型参数:
      T - PrivilegedExceptionAction的run方法返回的值的类型。
      参数:
      action - 要执行的操作。
      context - 表示在执行指定操作之前应用于调用者域权限的限制的访问控制上下文。如果上下文为null,则不会应用任何额外限制。
      perms - 限制调用者权限范围的Permission参数。参数数量可变。
      返回:
      操作的run方法返回的值。
      抛出:
      PrivilegedActionException - 如果指定的操作的run方法抛出一个已检查的异常
      NullPointerException - 如果操作或perms或perms的任何元素为null
      自Java版本:
      1.8
      参见:
    • getContext

      public static AccessControlContext getContext()
      Deprecated, for removal: This API element is subject to removal in a future version.
      该方法获取当前调用上下文的"快照",包括当前线程继承的AccessControlContext和任何有限的特权范围,并将其放置在一个AccessControlContext对象中。稍后可能在另一个线程中检查此上下文。
      返回:
      基于当前上下文的AccessControlContext
      参见:
    • checkPermission

      public static void checkPermission(Permission perm) throws AccessControlException
      Deprecated, for removal: This API element is subject to removal in a future version.
      根据当前AccessControlContext和安全策略确定是否应允许或拒绝指定权限所指示的访问请求。如果访问请求被允许,则此方法静默返回,否则会抛出AccessControlExceptionAccessControlExceptiongetPermission方法返回Permission对象实例(perm)。
      参数:
      perm - 请求的权限。
      抛出:
      AccessControlException - 如果根据当前安全策略,指定的权限不被允许。
      NullPointerException - 如果指定的权限为null,并且根据当前生效的安全策略进行检查。