CDC 1.1.2

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、2、...、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 オブジェクトの checkPermission メソッドを呼び出すことができます。呼び出しの例を次に示します。

 
   acc.checkPermission(permission)
 
 

また、コンテキストをどのアクセス権で検査するかが、事前には不明な場合があります。こうした場合には、コンテキストを値としてとる doPrivileged メソッドを使用できます。

   somemethod() {
         AccessController.doPrivileged(new PrivilegedAction() {
              public Object run() {
                 // ここにコードが記述されます。この run メソッド内の
                 // アクセス権のチェックでは、呼び出し側の保護ドメインと
                 // スナップショットのコンテキストに必要な
                 // アクセス権がある必要があります。
              }
         }, 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 メソッドによって返される値
例外:
PrivilegedActionException - 指定されたアクションの run メソッドが「確認済」の例外をスローした場合
関連項目:
doPrivileged(PrivilegedAction), doPrivileged(PrivilegedExceptionAction,AccessControlContext)

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 - 現在のセキュリティーポリシーに基づいて、指定されたアクセス権が許可されない場合

CDC 1.1.2

Copyright 2006 Sun Microsystems, Inc. All Rights Reserved. Use of this specification is subject to license terms.