削除のために非推奨になったSubject.getSubjectメソッドおよびSubject.doAsメソッドからSubject.currentメソッドおよびSubject.callAsメソッドへの移行

ノート:

JDK 24で、セキュリティ・マネージャは永続的に無効になりました。詳細は、JEP 486を参照してください。

javax.security.auth.Subjectクラスの次のメソッドは、削除のために非推奨となったSecurity Manager 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)

JDK 24以降、Subject current()およびT callAs(Subject, Callable<T>)に加えて、これらのメソッドは次のように動作します:

  • getSubject: メソッドはUnsupportedOperationExceptionをスローします。
  • current: メソッドは、現在のスレッドの実行期間にバインドされたSubjectを返します。
  • doAsおよびdoAsPrivileged: これらのメソッドは、アクションのバインドされた期間実行の現在のサブジェクトとしてSubjectを使用してアクションを呼び出します。
  • callAs: doAsと同じように動作しますが、アクション引数Callable<T>およびスローされる例外CompletedExceptionのタイプは異なります。

セキュリティ・マネージャが完全に無効になっているため、コード内でSubject.getSubject(AccessControlContext)メソッドとSubject.doAsメソッドをそれぞれSubject.current()メソッドとSubject.callAs(Subject, Callable<T>)に置き換えます。特定のSubjectとしてアクションを実行するためのcallAsおよび現在のメソッドを参照してください。

ノート:

Subject.doAsPrivilegedメソッドには置換え可能なAPIはありません。

SubjectAccessControlContextに格納し、Subject.current()メソッドで取得し、そのコンテキストでAccessController.doPrivilegedを呼び出すことはできなくなりました。

ただし、構造化並行性を持つSubject.current()メソッドを使用して、子スレッドから親のスレッドの現在のSubjectにアクセスできます。詳細は、『Java Platform, Standard Editionコア・ライブラリ』「構造化並行性」および「特定のSubjectとしてアクションを実行するためのcallAsおよび現在のメソッド」を参照してください。

コード内の子スレッドがAccessControlContextクラスを介して親スレッドのSubjectにアクセスするかどうかを確認します。その場合は、親スレッドが新しく作成されたスレッドにSubjectを渡すか、構造化並行性を使用するようにコードを変更します。