跳到主要内容

JEP 140:有限的 doPrivileged

QWen Max 中英对照

概述

启用代码以声明其部分权限,而不会阻止完整的访问控制堆栈遍历来检查其他权限。

动机

当你需要启用某些权限,同时允许其他权限继续进行堆栈遍历时,这非常有用。

描述

添加一个带有权限参数的 java.security.AccessController.doPrivileged 方法。

例如,一些引导 JRE 的代码可能会声明特权,以通过 HTTP 获取配置文件:

// 示例代码
AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
// 通过 HTTP 获取配置文件的逻辑
return null;
});
java
AccessController.doPrivileged(anon class...,
new URLPermission(url,
request props ...,
"GET") ...

一个与 URLPermission 匹配的 checkPermission()(由 http 处理程序执行)将会在调用 doPrivileged() 时停止遍历访问控制上下文 (acc) 栈并成功返回。然而,对于不匹配的 URLPermission 或其他某些权限的检查,则会匹配 JRE 类通常被赋予的权限,并继续遍历整个 acc 栈,就好像没有调用过限制性的 doPrivileged() 一样。

这些有限的权限也被 getAccessControlContext() 和线程继承捕获。