|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
java.lang.Object java.security.AccessController
public final class AccessController
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
|
doPrivileged(PrivilegedAction<T> action)
啟用特權,執行指定的 PrivilegedAction 。 |
|
static
|
doPrivileged(PrivilegedAction<T> action,
AccessControlContext context)
通過指定的 AccessControlContext 啟用和限制特權,執行指定的 PrivilegedAction 。 |
|
static
|
doPrivileged(PrivilegedExceptionAction<T> action)
啟用特權,執行指定的 PrivilegedExceptionAction 。 |
|
static
|
doPrivileged(PrivilegedExceptionAction<T> action,
AccessControlContext context)
通過指定的 AccessControlContext 啟用和限制特權,執行指定的 PrivilegedExceptionAction 。 |
|
static
|
doPrivilegedWithCombiner(PrivilegedAction<T> action)
啟用特權,執行指定的 PrivilegedAction 。 |
|
static
|
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 |
方法詳細資訊 |
---|
public static <T> T doPrivileged(PrivilegedAction<T> action)
PrivilegedAction
。該操作在調用者保護域所擁有的全部 權限下執行。
如果該操作的 run
方法拋出(未經過檢查的)異常,則該異常將通過此方法傳播。
注意,執行該操作時,任何與當前 AccessControlContext 關聯的 DomainCombiner 都將被忽略。
action
- 要執行的操作。
run
方法返回的值。
NullPointerException
- 如果該操作為 null
。doPrivileged(PrivilegedAction,AccessControlContext)
,
doPrivileged(PrivilegedExceptionAction)
,
doPrivilegedWithCombiner(PrivilegedAction)
,
DomainCombiner
public static <T> T doPrivilegedWithCombiner(PrivilegedAction<T> action)
PrivilegedAction
。該操作在調用者保護域所擁有的全部 權限下執行。
如果操作的 run
方法拋出(未經過檢查的)異常,那麼它將通過此方法傳播。
執行該操作時,此方法保留當前 AccessControlContext 的 DomainCombiner(可能為 null)。
action
- 要執行的操作。
run
方法返回的值。
NullPointerException
- 如果 action 為 null
doPrivileged(PrivilegedAction)
,
DomainCombiner
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)
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
public static <T> T doPrivilegedWithCombiner(PrivilegedExceptionAction<T> action) throws PrivilegedActionException
PrivilegedExceptionAction
。該操作在調用者保護域所擁有的全部 權限下執行。
如果操作的 run
方法拋出(未經過檢查的)異常,則該異常將通過此方法傳播。
執行該操作時,此方法保留當前 AccessControlContext 的 DomainCombiner(可能為 null)。
action
- 要執行的操作。
run
方法返回的值
PrivilegedActionException
- 如果指定操作的 run
方法拋出經過檢查的 異常
NullPointerException
- 如果操作為 null
doPrivileged(PrivilegedAction)
,
doPrivileged(PrivilegedExceptionAction,AccessControlContext)
,
DomainCombiner
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)
public static AccessControlContext getContext()
AccessControlContext
public static void checkPermission(Permission perm) throws AccessControlException
perm
- 請求的權限。
AccessControlException
- 如果根據當前的安全策略不允許使用指定的權限。
NullPointerException
- 如果指定權限為 null
並且基於當前生效的安全策略進行了檢查。
|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only。