削除予定の非推奨となったメソッドSubject::getSubjectおよびSubject::doAsのSubject::currentおよびSubject::callAsへの移行
次のメソッドは、削除予定の非推奨となったセキュリティ・マネージャAPIに依存しているため、削除予定の非推奨になりました。
- Subject getSubject(AccessControlContext)
- T doAs(Subject, PrivilegedAction<T>)
- T doAs(Subject, PrivilegedExceptionAction<T>)
- T doAsPrivileged(Subject, PrivilegedAction<T>, AccessControlContext)
- T doAsPrivileged(Subject, PrivilegedExceptionAction<T>, AccessControlContext)
これらのメソッドは、Subject current()およびT callAs(Subject, Callable<T>)に加えて、セキュリティ・マネージャが許可されるかどうかに応じて動作が異なります:
表6-5 Subjectメソッド間の動作の違い
メソッド | セキュリティ・マネージャは許可されています | セキュリティ・マネージャは許可されていません |
---|---|---|
getSubject | 以前のリリースと比較して動作は変更されません。 | メソッドは、UnsupportedOperationExceptionをスローします。
このメソッドは、セキュリティ・マネージャと連動して削除予定の非推奨となったAccessControlContextクラスに依存します。 |
current | 以前のリリースと比較して動作は変更されません。 | 現在のスレッドの実行期間にバインドされたSubjectを返します。 |
doAsおよびdoAsPrivileged | 以前のリリースと比較して動作は変更されません。
メソッドによって、指定されたSubjectが現在のスレッドのAccessControlContextに関連付けられ、PrivilegedActionまたはPrivilegedExceptionActionが実行されます。これにより、Subjectとしてアクションを実行させる効果を実現します。 |
Subjectは、現在のスレッドのAccessControlContextに関連付けられていません。かわりに、これらのメソッドは、アクションのバインドされた期間実行の現在のSubjectとしてSubjectを使用したアクションを起動します。 |
callAs | アクション引数Callable<T>およびスローされた例外CompletedExceptionのタイプが異なることを除き、doAsと同じように動作します(セキュリティ・マネージャが許可されています)。 | アクション引数Callable<T>およびスローされた例外CompletedExceptionのタイプが異なることを除き、doAsと同じように動作します(セキュリティ・マネージャが許可されていません)。 |
ノート:
システム・プロパティjava.security.manager
の値が空の行、クラス名または値allow
にコマンドラインで設定されている場合は、セキュリティ・マネージャは許可されています。java.security.manager
の値が設定されていないか、値disallow
に設定されている場合は、セキュリティ・マネージャは許可されていません。
doAsおよびdoAsPrivilegedメソッドの動作が、セキュリティ・マネージャが許可されているかどうかに応じてどのように変化するかの詳細は、「特定のSubjectとしてアクションを実行するdoAsメソッド」を参照してください。
セキュリティ・マネージャは削除予定の非推奨であるため、コード内でメソッドSubject::getSubjectおよびSubject::doAsをそれぞれSubject::currentおよびSubject::callAsに置き換えることを強くお薦めします。特定のSubjectとしてアクションを実行するためのcallAsおよび現在のメソッドを参照してください。
ノート:
Subject::doAsPrivilegedメソッドには置換APIはありません。Subject::getSubjectメソッドは、指定されたAccessControlContextに関連付けられたSubjectを返します。ただし、AccessControlContextクラスは削除予定の非推奨となりました。
セキュリティ・マネージャの削除時にこのコードが機能しなくなるため、AccessControlContext
にSubjectを格納するコードを移行し、できるだけ早くそのコンテキストでAccessController.doPrivileged
を起動する必要があります。
セキュリティ・マネージャが許可されている場合、AccessControlContextクラスはSubject::getSubjectと連動して、子スレッドから親スレッドの現在のSubjectにアクセスできるようにします。セキュリティ・マネージャが許可されていない場合、コードは、構造化並行性を持つSubject::currentメソッドを使用して、子スレッドから親スレッドの現在のSubject
にアクセスできます。詳細は、『Java Platform, Standard Editionコア・ライブラリ』の「構造化並行性」および「特定のSubjectとしてアクションを実行するためのcallAsおよび現在のメソッド」を参照してください。
コード内の子スレッドがAccessControlContextクラスを介して親スレッドのSubjectにアクセスするかどうかを確認します。その場合は、親スレッドが新しく作成されたスレッドにSubjectを渡すか、構造化並行性を使用するようにコードを変更します。