JavaTM 2 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 2 Platform
Standard Ed. 6

提交錯誤或意見

版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only