モジュール java.base
パッケージ java.lang

クラスSecurityManager

java.lang.Object
java.lang.SecurityManager
直系の既知のサブクラス:
RMISecurityManager

@Deprecated(since="17", forRemoval=true) public class SecurityManager extends Object
削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。
Security Managerは非推奨であり、将来のリリースで削除される可能性があります。 Security Managerの代替はありません。 説明と代替は、JEP 411を参照してください。
セキュリティ・マネージャとは、アプリケーションがセキュリティ・ポリシーを実装できるクラスです。 セキュリティ・マネージャを使えば、セキュリティを損なう恐れのある操作を実行する前に、操作が何であるかということと、セキュリティ・コンテキスト内でその操作の実行が許可されているかどうかがアプリケーションから判断できます。 アプリケーションは、そのような操作を禁止したり許可したりすることができます。

SecurityManagerクラスには、名前がcheckで始まるメソッドが多数あります。 これらのメソッドは、Javaライブラリ内の各種メソッドによって、セキュリティを損なう可能性のある操作を実行する前に呼び出されます。 このようなcheckメソッド呼出しの一般的な例を次に示します。

     SecurityManager security = System.getSecurityManager();
     if (security != null) {
         security.checkXXX(argument,  . . . );
     }
 

これにより、セキュリティ・マネージャには、例外をスローして操作の実行を回避する機会が与えられます。 セキュリティ・マネージャ・ルーチンは、操作が許可される場合は何も行わずに復帰します。操作が許可されない場合はSecurityExceptionをスローします。

セキュリティ・マネージャの設定

セキュリティ・マネージャを使用する環境は通常、起動時にセキュリティ・マネージャを設定します。 JDKの実装では、これを行うために、コマンド行でシステム・プロパティjava.security.managerをセキュリティ・マネージャのクラス名に設定します。 空のString ("")または特別なトークン"default"に設定して、デフォルトのjava.lang.SecurityManagerを使用することもできます。 クラス名を指定する場合、java.lang.SecurityManagerまたはパブリック・サブクラスであり、パブリックで引数のないコンストラクタを持つ必要があります。 クラスはjava.lang.SecurityManagerでない場合、「組込みシステム・クラス・ローダー」によってロードされます。 java.security.managerシステム・プロパティが設定されていない場合、デフォルト値はnullです。つまり、起動時にセキュリティ・マネージャは設定されません。

Javaの実行時でも、setSecurityManagerメソッドを呼び出すことで、セキュリティ・マネージャを動的に設定することも可能ですが、許可する必要はありません。 JDK実装で、java.security.managerシステム・プロパティを特殊なトークン"allow"に設定してJava仮想マシンを起動した場合、セキュリティ・マネージャは起動時に設定されませんが、動的に設定できます。 java.security.managerシステム・プロパティが設定されていないか、特殊なトークン"disallow"に設定されていない状態でJava仮想マシンを起動した場合、セキュリティ・マネージャは起動時に設定されず、動的に(setSecurityManagerメソッドがUnsupportedOperationExceptionをスロー)を設定できません。 最後に、java.security.managerシステム・プロパティがセキュリティ・マネージャのクラス名または空の文字列("")または特別なトークン"default"に設定されている場合、セキュリティ・マネージャは起動時に(前述のとおり)に設定され、続いて(または無効)動的(現在インストールされているセキュリティ・マネージャのポリシーに従う)に置換されます。 次の表に、java.security.managerシステム・プロパティの設定ごとのJDK実装の動作を示します:

プロパティ値SecurityManagerは起動時に設定され、動的にSecurityManagerを設定できます
プロパティ値 起動時のSecurityManagerセット System.set SecurityManager実行時の動作
null なし UnsupportedOperationExceptionをスローします
空の文字列("") java.lang.SecurityManager 現在インストールされているセキュリティ・マネージャによって許可されない場合は、SecurityExceptionを成功またはスロー
"default" java.lang.SecurityManager 現在インストールされているセキュリティ・マネージャによって許可されない場合は、SecurityExceptionを成功またはスロー
"disallow" なし UnsupportedOperationExceptionをスローします
"allow" なし 現在インストールされているセキュリティ・マネージャによって許可されない場合は、SecurityExceptionを成功またはスロー
クラス名 指定されたクラス 現在インストールされているセキュリティ・マネージャによって許可されない場合は、SecurityExceptionを成功またはスロー

現在のセキュリティ・マネージャは、getSecurityManagerメソッドによって返されます。

アクセス制限チェック

特殊メソッドcheckPermission(java.security.Permission)は、指定されたアクセス権によって示されるアクセス要求が許可されるか、拒否されるかを決定します。 デフォルトの実装では、次のメソッドが呼び出されます。
   AccessController.checkPermission(perm);
 

要求されたアクセス権が許可される場合、checkPermissionは何もしないで復帰します。 許可されない場合は、SecurityExceptionがスローされます。

SecurityManagerの他の各checkメソッドのデフォルト実装では、SecurityManager checkPermissionメソッドを呼び出して、呼び出し元スレッドにリクエストされた操作を実行する権限があるかどうかを判断します。

アクセス権の引数が1つだけのcheckPermissionメソッドは常に、現在実行中のスレッドのコンテキスト内だけでセキュリティ・チェックを実行します。 しかし実際には、指定されたコンテキスト内で行うセキュリティ・チェックを、別のコンテキスト内から(たとえば、ワーカー・スレッド内から)行わなければならない場合もあります。 getSecurityContextメソッドと、コンテキスト引数を含むcheckPermissionメソッドは、この状況のために用意されたものです。 getSecurityContextメソッドは、現在の呼出し側コンテキストのスナップショットを返します。 デフォルトの実装ではAccessControlContextオブジェクトを返します。 呼出しの例を次に示します。

   Object context = null;
   SecurityManager sm = System.getSecurityManager();
   if (sm != null) context = sm.getSecurityContext();
 

アクセス権に加えてコンテキスト・オブジェクトも受け取るcheckPermissionメソッドは、実行中のスレッドのコンテキストではなく、渡されたコンテキストに従ってアクセスを判定します。 このため、別のコンテキスト内のコードは、アクセス権と直前に保存したコンテキスト・オブジェクトを渡すことによって、このメソッドを呼び出すことができます。 次に示す呼出し例では、上の例で取得したセキュリティ・マネージャsmを使用しています。

   if (sm != null) sm.checkPermission(permission, context);
 

アクセス権は、カテゴリFile、Socket、Net、Security、Runtime、Property、AWT、Reflect、Serializableのどれかに分類されます。 これらの各種アクセス権カテゴリを管理するクラスが、java.io.FilePermissionjava.net.SocketPermissionjava.net.NetPermissionjava.security.SecurityPermissionjava.lang.RuntimePermissionjava.util.PropertyPermissionjava.awt.AWTPermission, java.lang.reflect.ReflectPermission、およびjava.io.SerializablePermissionです。

FilePermissionとSocketPermission以外のクラスは、java.security.BasicPermissionのサブクラスです。このjava.security.BasicPermission自身は、アクセス権のトップ・レベルであるjava.security.Permissionの抽象サブクラスです。 BasicPermissionは、「exitVM」、「setFactory」、「queuePrintJob」といった、階層的プロパティ命名規則に従う名前を含むすべてのアクセス権のために必要な機能を定義します。 名前の末尾には「*」や「.*」を付けて、ワイルドカードを指定できます。 たとえば、「a.」や「*」は有効ですが、「*a」や「a*b」は無効です。

FilePermissionとSocketPermissionは、アクセス権のトップ・レベルjava.security.Permissionのサブクラスです。 これらのクラスは、BasicPermissionよりも複雑な名前構文を持ち、BasicPermissionではなくPermissionから直接サブクラス化されます。 たとえば、java.io.FilePermissionオブジェクトの場合、アクセス権の名前はファイルまたはディレクトリのパス名です。

アクセス権クラスの中には、オブジェクトに許可されているアクションを示すアクション・リストを持つものがあります。 たとえばjava.io.FilePermissionオブジェクトの場合、「read, write」といったアクション・リストは、特定のファイルまたは指定されたディレクトリにあるファイルに対して実行できるアクションを示します。

その他のアクセス権クラスは、名前の付いたアクセス権(名前付きアクセス権)に使用します。名前付きアクセス権は、名前は持ちますが、アクション・リストを持ちません。名前付きアクセス権はあってもなくてもかまいません。

ノート: すべてのアクセス権を暗黙的に指定するjava.security.AllPermissionというアクセス権もあります。 これは、すべての(あるいは多くの)アクセス権を要求する複数のタスクを実行する必要がある、システム管理者の作業を単純化するためのアクセス権です。

権限関連の情報については、「Java Development Kit (JDK)の権限」を参照してください。 このドキュメントには、各そのメソッドのデフォルトの実装が必要である各種のSecurityManager checkメソッドとpermission(s)をリストする表が含まれています。 また、アクセス権を必要とするメソッドの表も含まれています。また、そのような各メソッドについて、必要なアクセス許可を指示します。

導入されたバージョン:
1.0
関連項目: