原文はこちら。
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::doAsとSubject::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::doAs | Subject::callAs |
Subject::getSubject | Subject::current |
Subject.doAsとSubject.getSubjectを使っているコードのメンテナンス担当者に対し、移行先のメソッドであるSubject.callAsとSubject.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/
さらに、SubjectをAccessControlContextに保存し、そのコンテキストでAccessController.doPrivilegedを呼び出すコードをできるだけ早く移行することも検討してください。このようなコードは、Security Managerが削除されると動作しなくなります。
More Details
これはサマリーです。詳細はJDK 23のリリースノートをご覧ください。
JDK 23 Early-Access Release Notes
https://jdk.java.net/23/release-notes