|
JavaTM Platform Standard Ed. 6 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
java.lang.Object java.security.AccessController
public final class AccessController
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
メソッドは次のアルゴリズムに基づいて、アクセスが許可されるか拒否されるかを決定します。
i = m; while (i > 0) { if (呼び出し側のドメインにアクセス権がない) throw AccessControlException else if (呼び出し元 i が特権コードとしてマークされている) { if (コンテキストが doPrivileged の呼び出しで指定された) context.checkPermission(permission) return; } i = i - 1; }; // それから、スレッドが作成されたときに継承された // コンテキストをチェックします。新しいスレッドが // 作成されたときは常に、「継承された」コンテキストとして // その時点の AccessControlContext が格納され、 // 新しいスレッドと関連付けられます。 inheritedContext.checkPermission(permission);
呼び出し側は、特権コードとしてマークできます (doPrivileged
および以下の説明を参照)。アクセス制御を決定する場合、checkPermission
メソッドは、コンテキスト引数のない doPrivileged
の呼び出しによって特権コードとしてマークされた呼び出し側に届いたときに、検査を中止します (コンテキスト引数については、以下の説明を参照)。その呼び出し元のドメインが指定されたアクセス権を持っている場合は、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 は、Object を返す run
というメソッドを持つインタフェースです。上記の例は、そのインタフェースの実装の作成方法を示しています。 つまり、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
節に表示されている例外) をスローする可能性がある場合には、PrivilegedAction
インタフェースの代わりに PrivilegedExceptionAction
インタフェースを使用する必要があります。
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
は、常に現在実行しているスレッドのコンテキスト内でセキュリティーチェックを行います。しかし実際には、指定されたコンテキスト内で行うセキュリティーチェックを、「別の」コンテキスト内から (たとえば、ワークスレッド内から) 行わなければならない場合もあります。この状況に対応するために、getContext
メソッドと AccessControlContext クラスが提供されています。getContext
メソッドは、現在の呼び出しコンテキストを AccessControlContext オブジェクトに格納して返します。呼び出しの例を次に示します。
AccessControlContext acc = AccessController.getContext()
AccessControlContext 自体が checkPermission
メソッドを持っており、このメソッドを使って、現在の実行スレッドのコンテキストではなくカプセル化しているコンテキストに基づいてアクセスの判断を行います。したがって、別のコンテキスト内のコードは、以前に保存した AccessControlContext オブジェクトを呼び出すことができます。呼び出しの例を次に示します。
acc.checkPermission(permission)
また、コンテキストをどのアクセス権で検査するかが、事前には不明な場合があります。こうした場合には、コンテキストを値としてとる doPrivileged メソッドを使用できます。
somemethod() { AccessController.doPrivileged(new PrivilegedAction() { public Object run() { // ここにコードが記述されます。この run メソッド内の // アクセス権のチェックでは、呼び出し側の保護ドメインと // スナップショットのコンテキストに必要な // アクセス権がある必要があります。 } }, 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()
現在のスレッドの継承された 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
- アクションが 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 Platform Standard Ed. 6 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。