JavaTM Platform
Standard Ed. 6

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 は、要求されたアクセス権が不正な型であったり、無効な値を含んでいたりした場合にもスローされる可能性があります。可能な場合には、そうした情報が提供されます。 現在のスレッドが呼び出し元 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
<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
<T> T
doPrivilegedWithCombiner(PrivilegedAction<T> action)
          有効になった特権を使って、指定された PrivilegedAction を実行します。
static
<T> T
doPrivilegedWithCombiner(PrivilegedExceptionAction<T> action)
          有効になった特権を使って、指定された 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 メソッドが未確認の例外をスローすると、例外はこのメソッドを使って送られます。

アクションの実行中、現在の AccessControlContext に関連付けられている DomainCombiner は無視されます。

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

doPrivilegedWithCombiner

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

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

このメソッドは、アクションの実行中、現在の AccessControlContext の DomainCombiner (null の場合もある) を保存します。

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

doPrivileged

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)

doPrivileged

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

doPrivilegedWithCombiner

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

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

このメソッドは、アクションの実行中、現在の AccessControlContext の DomainCombiner (null の場合もある) を保存します。

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

doPrivileged

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)

getContext

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

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

checkPermission

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

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

JavaTM Platform
Standard Ed. 6

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

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