public final class AccessController extends Object
AccessController クラスは、アクセス制御の操作と決定に使用されます。
具体的には、AccessController クラスを次の 3 つの目的で使用します。
checkPermission
メソッドは、指定されたアクセス権によって示されるアクセス要求が許可されるか、拒否されるかを決定します。呼び出しの例を次に示します。この例では、checkPermission
は、/temp ディレクトリの testFile というファイルへの読み込み権を許可するかどうかを決定します。
FilePermission perm = new FilePermission("/temp/testFile", "read"); AccessController.checkPermission(perm);
要求されたアクセス権が許可される場合、checkPermission
は何もしないで復帰します。アクセスが拒否される場合には、AccessControlException がスローされます。AccessControlException は、要求されたアクセス権が不正な型であったり、無効な値を含んでいたりした場合にもスローされる可能性があります。可能な場合には、そうした情報が提供されます。
現在のスレッドが呼び出し元 1 から数字の昇順で m 個の呼び出し元をトラバースし、呼び出し元 m が 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)
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
の呼び出しによって特権コードとしてマークされた呼び出し側に届いたときに、検査を中止します (コンテキスト引数については、次の説明を参照)。その呼び出し元のドメインが指定されたアクセス権を持っている場合は、checkPermission
はそれ以上のチェックを行わずに正常復帰し、要求されたアクセスが許可されていることを示します。そのドメインが指定されたアクセス権を持たない場合は、通常は例外が発行されます。
次に、特権機能の通常の使い方を説明します。「特権付き」ブロックからの戻り値が必要ない場合は、次のようにします。
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
メソッドは、特権を有効にしたあとで、PrivilegedAction の実装から 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
節に表示されている例外) をスローする可能性がある場合には、PrivilegedAction
インタフェースの代わりに PrivilegedExceptionAction
インタフェースを使用する必要があります。
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...
}
特権構造の使用には細心の注意を払って、特権コードセクションをできるだけ小さくしてください。
checkPermission
は、常に現在実行しているスレッドのコンテキスト内でセキュリティーチェックを行います。しかし実際には、指定されたコンテキスト内で行うセキュリティーチェックを、別のコンテキスト内から (たとえば、ワーカースレッド内から) 行わなければならない場合もあります。この状況に対応するために、getContext
メソッドと AccessControlContext クラスが提供されています。getContext
メソッドは、現在の呼び出しコンテキストを AccessControlContext オブジェクトに格納して返します。呼び出しの例を次に示します。
AccessControlContext acc = AccessController.getContext()
AccessControlContext 自体が checkPermission
メソッドを持っており、このメソッドを使って、現在の実行スレッドのコンテキストではなくカプセル化しているコンテキストに基づいてアクセスの判断を行います。したがって、別のコンテキスト内のコードは、以前に保存した AccessControlContext オブジェクトを呼び出すことができます。呼び出しの例を次に示します。
acc.checkPermission(permission)
また、コンテキストをどのアクセス権で検査するかが、事前には不明な場合があります。こうした場合には、コンテキストを値としてとる doPrivileged メソッドを使用できます。
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
// 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()
現在のスレッドの継承された AccessControlContext を含む、現在の呼び出し側コンテキストの「スナップショット」を取得し、AccessControlContext オブジェクトに配置します。
|
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
- アクションが次の場合: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
Permission オブジェクトインスタンスを返します。perm
- 要求されたアクセス権。AccessControlException
- 現在のセキュリティーポリシーに基づいて、指定されたアクセス権が許可されない場合。NullPointerException
- 指定されたアクセス権が null
であり、そのアクセス権が現在有効なセキュリティーポリシーに基づいてチェックされた場合。 バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.