Java プラットフォーム 1.2

java.security
クラス AccessController

java.lang.Object
  |
  +--java.security.AccessController

public final class AccessController
extends Object

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
 

メソッドの詳細

doPrivileged

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

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

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

doPrivileged

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

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

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

doPrivileged

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

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

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

doPrivileged

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

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

パラメータ:
action - 実行するアクション
context - 指定されたアクションの実行前に、呼び出し側の領域の特権に適用される制限を表す「アクセス制御コンテキスト」
戻り値:
アクションの run メソッドによって返される値
例外:
PrivilegedActionException - 指定されたアクションの run メソッドが「確認済」の例外をスローした場合
関連項目:
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 - 現在のセキュリティポリシーに基づいて、指定されたアクセス権が許可されない場合

Java プラットフォーム 1.2

バグや機能要求の報告
新しい javadoc の表示についてのコメントやご提案
Java は、米国およびその他の国における米国 Sun Microsystems, Inc. の商標もしくは登録商標です。
Copyright 1993-1998 Sun Microsystems, Inc. 901 San Antonio Road,
Palo Alto, California, 94303, U.S.A. All Rights Reserved.