质量推广提醒 - JDK23:重新指定的 Subject.getSubject API
内容提要
OpenJDK Quality Group鼓励使用OpenJDK构建的FOSS项目进行测试,以提高发布质量。JDK 17弃用了Security Manager,影响了Subject::doAs和Subject::getSubject等API。从JDK 23开始,主题授权和Subject API的行为取决于允许Security Manager。建议使用新的JAAS API作为替代方案。可以使用jdeprscan工具来识别弃用的API。存储Subject在AccessControlContext中的代码应进行迁移。有关更多详细信息,请参阅JDK 23发布说明。
延伸解读
JDK 23 行为变更的具体条件
从 JDK 23 开始,Subject.getSubject 的行为取决于是否允许 Security Manager。如果命令行设置了 java.security.manager 为空字符串、类名或 allow,则行为与之前版本一致;如果未设置或设置为 disallow,调用 Subject.getSubject 将抛出 UnsupportedOperationException。这意味着未显式允许 Security Manager 的应用可能突然遇到异常,需要检查启动参数。
迁移到新 JAAS API 的示例对比
文章通过代码示例展示了迁移方式:旧代码需要先获取 AccessControlContext,再调用 Subject.getSubject;新代码只需在 Subject.callAs 中直接调用 Subject.current。这种简化减少了对 Security Manager 相关 API 的依赖,使代码更适应未来移除 Security Manager 的趋势。
识别与迁移弃用 API 的工具建议
可以使用 jdeprscan 工具扫描 JAR 文件,找出对弃用 API 的使用,帮助定位需要迁移的代码。此外,文章特别提醒,将 Subject 存储在 AccessControlContext 中并调用 AccessController.doPrivileged 的代码应尽快迁移,因为当 Security Manager 被移除后,这类代码将完全失效。
Q&A
JDK 23中Subject.getSubject API的行为有什么变化?
在JDK 23中,Subject.getSubject API的行为取决于是否允许Security Manager,如果未设置或设置为disallow,将抛出UnsupportedOperationException。
如何迁移到新的JAAS API?
可以使用Subject.callAs替代Subject.doAs,使用Subject.current替代Subject.getSubject,尽快迁移相关代码。
为什么JDK 17弃用了Security Manager?
JDK 17弃用了Security Manager是为了简化安全管理,相关的API也被弃用以准备将来的移除。
如何使用jdeprscan工具?
jdeprscan工具可以扫描JAR文件以识别使用了弃用API的代码,帮助开发者进行迁移。
在JDK 23中,如何保持旧代码的兼容性?
可以通过在命令行中设置-Djava.security.manager=allow来临时允许Security Manager,以保持旧代码的兼容性。
存储Subject在AccessControlContext中的代码需要做什么?
存储Subject在AccessControlContext中的代码应尽快迁移,以免在Security Manager被移除后失效。