Quality Outreach Heads-Up – JDK23: Re-Specified Subject.getSubject API

原文はこちら。
The original article was written by Ana-Maria Mihalceanu (Senior Developer Advocate, Oracle).
https://inside.java/2024/07/08/quality-heads-up/

OpenJDK Quality Groupは、リリースの全体的な品質向上の手段としてOpenJDKビルドを使ってのFOSSプロジェクトのテストを推進しています。

Quality Outreach
https://wiki.openjdk.java.net/display/quality/Quality+Outreach

このHeads upは、関係するプロジェクトに送られる定期的なコミュニケーションの一部です。

The quality-discuss Archives
https://mail.openjdk.org/pipermail/quality-discuss/

このプログラムの詳細と参加方法については、上記wikiをご覧ください。

Subject.getSubject API Requires Allowing the Security Manager

JDK 17のJEP 411で発表があったように、Security Managerは廃止予定として非推奨になりました(deprecated for removal)。この変更の一環で、AccessControlContextのようなSecurity ManagerのAPIのいくつかが廃止予定として非推奨になっています。

JEP 411: Deprecate the Security Manager for Removal
https://openjdk.org/jeps/411

Subject::doAsSubject::getSubjectの両APIは、利用にあたってSecurity Managerのインストールは必要ありませんが、Security Manager関連のAPIに依存しています。サブジェクトを認可し、その資格情報に基づいて機密性の高い操作を実行するセキュアなアプリケーションを作成する際、このAPIが重要になってきます。

JDK 23で、Security Managerの将来的な削除に備えるため、アプリケーションはSecurity Managerを許可することで、サブジェクト認可とSubject APIの動作を変更できます。

システムプロパティjava.security.manager動作
コマンドラインで以下のいずれかを設定
– 空の文字列
– クラス名
– 値allow
以前のリリースと同じ(変更なし)
コマンドラインで値を設定していない
もしくは
コマンドラインで以下を設定
disallow
Subject.getSubjectメソッドを呼び出すと UnsupportedOperationExceptionがスローされる

しかし、JDK18以降、Security Manager APIに依存しない、新しいJava認証および認可サービス (JAAS) APIがあります。そのため、

-Djava.security.manager=allow

を指定してSecurity Managerの設定を許可するアプリケーションを実行するのは、古いコードを動作させるための一時的な回避策に過ぎない点に注意が必要です。

Subject API新JAAS API(移行先)
Subject::doAsSubject::callAs
Subject::getSubjectSubject::current

Subject.doAsSubject.getSubjectを使っているコードのメンテナンス担当者に対し、移行先のメソッドであるSubject.callAsSubject.currentにできるだけ早期に移行されることを強く推奨します。例えば、廃止予定のAPIを使って特定のSubjectとして作業を実行するためには、まずはAccessControlContextオブジェクトを取得する必要がありました。

Subject s1 = new Subject();
Subject.doAs(s1,
    (PrivilegedExceptionAction<Void>)() -> {
        AccessControlContext acc = AccessController.getContext();
        Subject s2 = Subject.getSubject(acc);
        return null;
});

これに対し、新しいAPIであれば、当該Subjectオブジェクトのcurrent()メソッドを呼び出すだけです。

Subject s1 = new Subject();
Subject.callAs(s1, () -> {
    Subject s2 = Subject.current();
    return null;
});

jdeprscanは JAR ファイルをスキャンして、非推奨 API 要素の使用状況を調べるツールで、これらのメソッドを使用しているコードを見つけるのにも役立ちます。

Jdeprscan – Deprecated API Elements Scanner
https://dev.java/learn/jvm/tools/core/jdeprscan/

さらに、SubjectAccessControlContextに保存し、そのコンテキストでAccessController.doPrivilegedを呼び出すコードをできるだけ早く移行することも検討してください。このようなコードは、Security Managerが削除されると動作しなくなります。

More Details

これはサマリーです。詳細はJDK 23のリリースノートをご覧ください。

JDK 23 Early-Access Release Notes
https://jdk.java.net/23/release-notes

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください