JavaTM 2 Platform
Standard Ed. 5.0

java.security
クラス AccessController

java.lang.Object
  上位を拡張 java.security.AccessController

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 は、要求されたアクセス権が不正な型であったり、無効な値を含んでいたりした場合にもスローされる可能性があります。可能な場合には、そうした情報が提供されます。ここで、現在のスレッドが、m 個の呼び出し元を、呼び出し元 1 から始めて呼び出し元 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 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)
          現在有効なセキュリティポリシーに基づいて、指定されたアクセス権によって示されるアクセス要求が許可されるか、拒否されるかを決定します。
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 AccessControlContext getContext()
          現在のスレッドの継承された 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 メソッドがチェックされない例外をスローすると、例外はこのメソッドを使って送られます。

パラメータ:
action - 実行されるアクション
戻り値:
アクションの run メソッドによって返される値
例外:
NullPointerException - アクションが null の場合
関連項目:
doPrivileged(PrivilegedAction,AccessControlContext), doPrivileged(PrivilegedExceptionAction)

doPrivileged

public static <T> T doPrivileged(PrivilegedAction<T> action,
                                 AccessControlContext context)
指定された AccessControlContext によって有効になり、かつ制限される特権を使って、指定された PrivilegedAction を実行します。アクションは、呼び出し側の保護領域で所有しているアクセス権と、指定された AccessControlContext によって表される領域で所有しているアクセス権の共通部分を使って実行されます。

アクションの run メソッドがチェックされない例外をスローすると、例外はこのメソッドを使って送られます。

パラメータ:
action - 実行されるアクション
context - 指定されたアクションの実行前に呼び出し側の領域の特権に適用すべき制限を表す「アクセス制御コンテキスト」。context が null の場合、追加の制限は適用されない
戻り値:
アクションの run メソッドによって返される値
例外:
NullPointerException - アクションが null の場合
関連項目:
doPrivileged(PrivilegedAction), doPrivileged(PrivilegedExceptionAction,AccessControlContext)

doPrivileged

public static <T> T doPrivileged(PrivilegedExceptionAction<T> action)
                      throws PrivilegedActionException
有効になった特権を使って、指定された PrivilegedExceptionAction を実行します。アクションは、呼び出し側の保護領域で所有している「すべての」アクセス権を使って実行されます。

アクションの run メソッドが「チェックされない」例外をスローすると、例外はこのメソッドを使って送られます。

パラメータ:
action - 実行されるアクション
戻り値:
アクションの run メソッドによって返される値
例外:
PrivilegedActionException - 指定されたアクションの run メソッドが「チェックされる」例外をスローした場合
NullPointerException - アクションが null の場合
関連項目:
doPrivileged(PrivilegedAction), doPrivileged(PrivilegedExceptionAction,AccessControlContext)

doPrivileged

public static <T> T doPrivileged(PrivilegedExceptionAction<T> action,
                                 AccessControlContext context)
                      throws PrivilegedActionException
指定された AccessControlContext によって有効になり、かつ制限される特権を使って、指定された PrivilegedExceptionAction を実行します。アクションは、呼び出し側の保護領域で所有しているアクセス権と、指定された AccessControlContext によって表される領域で所有しているアクセス権の共通部分を使って実行されます。

アクションの run メソッドが「チェックされない」例外をスローすると、例外はこのメソッドを使って送られます。

パラメータ:
action - 実行されるアクション
context - 指定されたアクションの実行前に呼び出し側の領域の特権に適用すべき制限を表す「アクセス制御コンテキスト」。context が null の場合、追加の制限は適用されない
戻り値:
アクションの run メソッドによって返される値
例外:
PrivilegedActionException - 指定されたアクションの run メソッドが「チェックされる」例外をスローした場合
NullPointerException - アクションが null の場合
関連項目:
doPrivileged(PrivilegedAction), doPrivileged(PrivilegedExceptionAction,AccessControlContext)

getContext

public static AccessControlContext getContext()
現在のスレッドの継承された AccessControlContext を含む、現在の呼び出し側コンテキストの「スナップショット」を取得し、AccessControlContext オブジェクトに配置します。このコンテキストは、あとで別のスレッドなどで検査される場合があります。

戻り値:
現在のコンテキストに基づく AccessControlContext
関連項目:
AccessControlContext

checkPermission

public static void checkPermission(Permission perm)
                            throws AccessControlException
現在有効なセキュリティポリシーに基づいて、指定されたアクセス権によって示されるアクセス要求が許可されるか、拒否されるかを決定します。このメソッドは、アクセス要求が許可される場合には何もしないで復帰し、そうでない場合には適切な AccessControlException をスローします。

パラメータ:
perm - 要求アクセス権
例外:
AccessControlException - 現在のセキュリティポリシーに基づいて、指定されたアクセス権が許可されない場合
NullPointerException - 指定されたアクセス権が null であり、そのアクセス権が現在有効なセキュリティポリシーに基づいてチェックされた場合

JavaTM 2 Platform
Standard Ed. 5.0

バグの報告と機能のリクエスト
さらに詳しい API リファレンスおよび開発者ドキュメントについては、Java 2 SDK SE 開発者用ドキュメントを参照してください。開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、およびコード実例が含まれています。

Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。