|
Java プラットフォーム 1.2 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 内部クラス | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
java.lang.Object | +--java.security.AccessController
AccessController クラスは、次の 3 つの目的で使用します。
checkPermission メソッドは、指定したアクセス権によって示されるアクセス要求が許可されるか、拒否されるかを決定します。以下に、呼び出しの例を示します。この例では、checkPermission
は、/temp ディレクトリの testFile というファイルへの読み取りアクセスを許可するかどうかを決定します。
FilePermission perm = new FilePermission("/temp/testFile", "read"); AccessController.checkPermission(perm);
要求したアクセスが許可される場合には、checkPermission
は何もしないで復帰します。拒否される場合には、AccessControlException がスローされます。要求したアクセス権が不適切であったり、無効な値を含んでいた場合にも、AccessControlException はスローされることがあります。そうした情報は、可能な場合には必ず提供されます。
現在のスレッドが、m 個の呼び出し側を 1、2 % % % 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 および以下の説明を参照)。アクセス制御を決定する場合、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
が呼び出されると、その 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 には、現在の実行スレッドのコンテキストではなく、AccessControlContext がカプセル化するコンテキストに基づいて、アクセスを決定する checkPermission
メソッドがあります。したがって、別のコンテキスト内のコードは、以前に保存した AccessControlContext オブジェクトの checkPermission
メソッドを呼び出すことができます。以下に、呼び出しの例を示します。
acc.checkPermission(permission)
また、コンテキストをどのアクセス権で検査するかが、事前には不明な場合があります。こうした場合には、コンテキストを値としてとる doPrivileged メソッドを使用できます。
somemethod() { AccessController.doPrivileged(new PrivilegedAction() { public Object run() { // Code goes here. Any permission checks from this // point forward require both the current context and // the snapshot's context to have the desired permission. } }, acc); ...normal code here... }
AccessControlContext
メソッドの概要 | |
static void |
checkPermission(Permission perm)
現在有効なセキュリティポリシーに基づいて、指定されたアクセス権によって示されるアクセス要求が許可されるか、拒否されるかを決定します。 |
static Object |
doPrivileged(PrivilegedAction action)
有効になった特権を使って、指定された PrivilegedAction を実行します。 |
static Object |
doPrivileged(PrivilegedAction action,
AccessControlContext context)
指定された AccessControlContext によって有効になり、かつ制限される特権を使って、指定された PrivilegedAction を実行します。 |
static Object |
doPrivileged(PrivilegedExceptionAction action)
有効になった特権を使って、指定された PrivilegedExceptionAction を実行します。 |
static Object |
doPrivileged(PrivilegedExceptionAction action,
AccessControlContext context)
指定された AccessControlContext によって有効になり、かつ制限される特権を使って、指定された PrivilegedExceptionAction を実行します。 |
static AccessControlContext |
getContext()
現在のスレッドの継承された AccessControlContext を含む、現在の呼び出し側コンテキストの「スナップショット」を取得し、AccessControlContext オブジェクトに配置します。 |
クラス java.lang.Object から継承したメソッド |
clone,
equals,
finalize,
getClass,
hashCode,
notify,
notifyAll,
toString,
wait,
wait,
wait |
メソッドの詳細 |
public static Object doPrivileged(PrivilegedAction action)
PrivilegedAction
を実行します。アクションは、呼び出し側の保護領域で所有している「すべての」アクセス権を使って実行されます。
アクションの run
メソッドが未確認の例外をスローすると、例外はこのメソッドを使って送られます。
action
- 実行するアクションrun
メソッドによって返される値doPrivileged(PrivilegedAction,AccessControlContext)
,
doPrivileged(PrivilegedExceptionAction)
public static Object doPrivileged(PrivilegedAction action, AccessControlContext context)
AccessControlContext
によって有効になり、かつ制限される特権を使って、指定された PrivilegedAction
を実行します。アクションは、呼び出し側の保護領域で所有しているアクセス権と、指定された AccessControlContext
によって表される領域で所有しているアクセス権の共通部分を使って実行されます。
アクションの run
メソッドが未確認の例外をスローすると、例外はこのメソッドを使って送られます。
action
- 実行するアクションcontext
- 指定されたアクションの実行前に、呼び出し側の領域の特権に適用される制限を表す「アクセス制御コンテキスト」run
メソッドによって返される値doPrivileged(PrivilegedAction)
,
doPrivileged(PrivilegedExceptionAction,AccessControlContext)
public static Object doPrivileged(PrivilegedExceptionAction action) throws PrivilegedActionException
PrivilegedExceptionAction
を実行します。アクションは、呼び出し側の保護領域で所有している「すべての」アクセス権を使って実行されます。
アクションの run
メソッドが「未確認」の例外をスローすると、例外はこのメソッドを使って送られます。
action
- 実行するアクションrun
メソッドによって返される値run
メソッドが確認済の例外をスローした場合doPrivileged(PrivilegedExceptionAction,AccessControlContext)
,
doPrivileged(PrivilegedAction)
public static Object doPrivileged(PrivilegedExceptionAction action, AccessControlContext context) throws PrivilegedActionException
AccessControlContext
によって有効になり、かつ制限される特権を使って、指定された PrivilegedExceptionAction
を実行します。アクションは、呼び出し側の保護領域で所有しているアクセス権と、指定された AccessControlContext
によって表される領域で所有しているアクセス権の共通部分を使って実行されます。
アクションの run
メソッドが「未確認」の例外をスローすると、例外はこのメソッドを使って送られます。
action
- 実行するアクションcontext
- 指定されたアクションの実行前に、呼び出し側の領域の特権に適用される制限を表す「アクセス制御コンテキスト」run
メソッドによって返される値run
メソッドが「確認済」の例外をスローした場合doPrivileged(PrivilegedAction)
,
doPrivileged(PrivilegedExceptionAction,AccessControlContext)
public static AccessControlContext getContext()
AccessControlContext
public static void checkPermission(Permission perm) throws AccessControlException
perm
- 要求されたアクセス権
|
Java プラットフォーム 1.2 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 内部クラス | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |