JEP 140:有限的 doPrivileged
概述
启用代码以声明其部分权限,而不会阻止完整的访问控制堆栈遍历来检查其他权限。
动机
当你需要启用某些权限,同时允许其他权限继续进行堆栈遍历时,这非常有用。
描述
添加一个带有权限参数的 java.security.AccessController.doPrivileged 方法。
例如,一些引导 JRE 的代码可能会声明特权,以通过 HTTP 获取配置文件:
// 示例代码
AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
// 通过 HTTP 获取配置文件的逻辑
return null;
});
AccessController.doPrivileged(anon class...,
new URLPermission(url,
request props ...,
"GET") ...
一个与 URLPermission 匹配的 checkPermission()(由 http 处理程序执行)将会在调用 doPrivileged() 时停止遍历访问控制上下文 (acc) 栈并成功返回。然而,对于不匹配的 URLPermission 或其他某些权限的检查,则会匹配 JRE 类通常被赋予的权限,并继续遍历整个 acc 栈,就好像没有调用过限制性的 doPrivileged() 一样。
这些有限的权限也被 getAccessControlContext() 和线程继承捕获。